Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NETOBSERV-700 Backport #262

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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