Skip to content

Commit

Permalink
server unix timestamp (#262)
Browse files Browse the repository at this point in the history
  • Loading branch information
jpinsonneau authored Dec 15, 2022
1 parent 0d7c6b2 commit cfbc9e2
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 19 deletions.
1 change: 1 addition & 0 deletions pkg/handler/topology.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ func getTopologyFlows(cfg *loki.Config, client httpclient.Caller, params url.Val

qr := merger.Get()
qr.IsMock = cfg.UseMocks
qr.UnixTimestamp = time.Now().Unix()
hlog.Tracef("GetTopology response: %v", qr)
return qr, http.StatusOK, nil
}
Expand Down
9 changes: 5 additions & 4 deletions pkg/model/loki.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ type QueryResponse struct {

// AggregatedQueryResponse represents the modified json response to one or more logQL queries
type AggregatedQueryResponse struct {
ResultType ResultType `json:"resultType"`
Result ResultValue `json:"result"`
Stats AggregatedStats `json:"stats"`
IsMock bool `json:"isMock"`
ResultType ResultType `json:"resultType"`
Result ResultValue `json:"result"`
Stats AggregatedStats `json:"stats"`
IsMock bool `json:"isMock"`
UnixTimestamp int64 `json:"unixTimestamp"`
}

// AggregatedStats represents the stats to one or more logQL queries
Expand Down
10 changes: 5 additions & 5 deletions pkg/model/loki_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,11 @@ func TestAggregatedQueryResponseMarshal(t *testing.T) {

js, err := json.Marshal(qr)
require.NoError(t, err)
assert.Equal(t, `{"resultType":"streams","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false}`, string(js))
assert.Equal(t, `{"resultType":"streams","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false,"unixTimestamp":0}`, string(js))
}

func TestAggregatedQueryResponseUnmarshal(t *testing.T) {
js := `{"resultType":"streams","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false}`
js := `{"resultType":"streams","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false,"unixTimestamp":0}`
var qr AggregatedQueryResponse
err := json.Unmarshal([]byte(js), &qr)
require.NoError(t, err)
Expand Down Expand Up @@ -95,11 +95,11 @@ func TestAggregatedQueryResponseMatrixMarshal(t *testing.T) {

js, err := json.Marshal(qr)
require.NoError(t, err)
assert.Equal(t, `{"resultType":"matrix","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false}`, string(js))
assert.Equal(t, `{"resultType":"matrix","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false,"unixTimestamp":0}`, string(js))
}

func TestAggregatedQueryResponseMatrixUnmarshal(t *testing.T) {
js := `{"resultType":"matrix","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false}`
js := `{"resultType":"matrix","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":null},"isMock":false,"unixTimestamp":0}`
var qr AggregatedQueryResponse
err := json.Unmarshal([]byte(js), &qr)
require.NoError(t, err)
Expand All @@ -126,5 +126,5 @@ func TestReencodeStats(t *testing.T) {
}
reencoded, err := json.Marshal(agg)
require.NoError(t, err)
assert.Equal(t, `{"resultType":"streams","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":[{"ingester":{"foo":"bar"}}]},"isMock":false}`, string(reencoded))
assert.Equal(t, `{"resultType":"streams","result":[],"stats":{"numQueries":1,"limitReached":false,"queriesStats":[{"ingester":{"foo":"bar"}}]},"isMock":false,"unixTimestamp":0}`, string(reencoded))
}
1 change: 1 addition & 0 deletions web/src/api/loki.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export interface AggregatedQueryResponse {
result: StreamResult[] | RawTopologyMetrics[];
stats: Stats;
isMock: boolean;
unixTimestamp: number;
}

export interface Stats {
Expand Down
8 changes: 7 additions & 1 deletion web/src/api/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,13 @@ export const getTopology = (params: FlowQuery, range: number | TimeRange): Promi
throw new Error(`${r.statusText} [code=${r.status}]`);
}
const aggQR: AggregatedQueryResponse = r.data;
const metrics = parseMetrics(aggQR.result as RawTopologyMetrics[], range, params.scope!, aggQR.isMock);
const metrics = parseMetrics(
aggQR.result as RawTopologyMetrics[],
range,
params.scope!,
aggQR.unixTimestamp,
aggQR.isMock
);
return { metrics: metrics, stats: aggQR.stats };
});
};
Expand Down
2 changes: 1 addition & 1 deletion web/src/components/__tests-data__/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,4 @@ export const metric3: RawTopologyMetrics = {
]
};

export const metrics = parseMetrics([metric1, metric2, metric3], { from: 1653989800, to: 1653990100 }, 'resource');
export const metrics = parseMetrics([metric1, metric2, metric3], { from: 1653989800, to: 1653990100 }, 'resource', 0);
Original file line number Diff line number Diff line change
Expand Up @@ -282,5 +282,6 @@ export const responseSample = {
export const dataSample = parseMetrics(
responseSample.data.result as RawTopologyMetrics[],
{ from: 1647965100, to: 1647965400 },
'resource'
'resource',
0
);
8 changes: 4 additions & 4 deletions web/src/utils/__tests__/metrics.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ describe('normalize and computeStats', () => {
[1664372300, '8']
];

const { start, end, step } = calibrateRange([values], { from: 1664372000, to: 1664372300 });
const { start, end, step } = calibrateRange([values], { from: 1664372000, to: 1664372300 }, 1664372300, true);
const norm = normalizeMetrics(values, start, end, step);
expect(norm).toEqual([
[1664372000, 5],
Expand Down Expand Up @@ -98,7 +98,7 @@ describe('normalize and computeStats', () => {
[first + 285, '8']
];

const { start, end, step } = calibrateRange([values], 300);
const { start, end, step } = calibrateRange([values], 300, now, true);
const norm = normalizeMetrics(values, start, end, step);
expect(norm).toEqual([
[first, 5],
Expand Down Expand Up @@ -150,7 +150,7 @@ describe('normalize and computeStats', () => {
[1664372300, '8']
];

const { start, end, step } = calibrateRange([values], { from: 1664372000, to: 1664372300 });
const { start, end, step } = calibrateRange([values], { from: 1664372000, to: 1664372300 }, 1664372300, true);
const norm = normalizeMetrics(values, start, end, step);
expect(norm).toEqual([
[1664372000, 5],
Expand Down Expand Up @@ -382,7 +382,7 @@ describe('parseMetrics', () => {
}
];

const parsed = parseMetrics(metrics, 300, 'resource');
const parsed = parseMetrics(metrics, 300, 'resource', 0, true);

expect(parsed).toHaveLength(2);
expect(parsed[0].source.getDisplayName(true, true)).toEqual('ns1.A');
Expand Down
8 changes: 5 additions & 3 deletions web/src/utils/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ export const parseMetrics = (
raw: RawTopologyMetrics[],
range: number | TimeRange,
scope: MetricScope,
unixTimestamp: number,
isMock?: boolean
): TopologyMetrics[] => {
const { start, end, step } = calibrateRange(
raw.map(r => r.values),
range,
unixTimestamp,
isMock
);
const metrics = raw.map(r => parseMetric(r, start, end, step, scope));
Expand Down Expand Up @@ -153,6 +155,7 @@ const parseMetric = (
export const calibrateRange = (
raw: [number, unknown][][],
range: number | TimeRange,
unixTimestamp: number,
isMock?: boolean
): { start: number; end: number; step: number } => {
// Extract some info based on range, and apply a tolerance about end range when it is close to "now"
Expand All @@ -161,9 +164,8 @@ export const calibrateRange = (
let start: number;
let endWithTolerance: number;
if (typeof range === 'number') {
const end = Math.floor(new Date().getTime() / 1000);
endWithTolerance = end - latencyTolerance;
start = end - rangeInSeconds;
endWithTolerance = unixTimestamp - latencyTolerance;
start = unixTimestamp - rangeInSeconds;
} else {
start = range.from;
endWithTolerance = range.to;
Expand Down

0 comments on commit cfbc9e2

Please sign in to comment.