Skip to content

Commit

Permalink
chore: add some charts using k6 data (#656)
Browse files Browse the repository at this point in the history
  • Loading branch information
rdubrock authored Dec 13, 2023
1 parent 32db849 commit 2d1d40e
Show file tree
Hide file tree
Showing 7 changed files with 236 additions and 2 deletions.
7 changes: 6 additions & 1 deletion src/page/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ export const HomePage = () => {
const usage = useUsageCalc(checks);
const { isEnabled: scenesEnabled } = useFeatureFlag(FeatureName.Scenes);
const { isEnabled: multiHttpEnabled } = useFeatureFlag(FeatureName.MultiHttp);
const { isEnabled: scriptedEnabled } = useFeatureFlag(FeatureName.ScriptedChecks);

useEffect(() => {
// Sort to make sure the summary dashboard is at the top of the list
Expand Down Expand Up @@ -174,9 +175,13 @@ export const HomePage = () => {
dashboardList.splice(3, 0, { title: 'MULTIHTTP dashboard', uid: 'multihttp' });
}

if (scriptedEnabled) {
dashboardList.push({ title: 'Scripted dashboard', uid: 'k6' });
}

setDashboards(dashboardList);
}
}, [instance.api, scenesEnabled, multiHttpEnabled]);
}, [instance.api, scenesEnabled, multiHttpEnabled, scriptedEnabled]);

return (
<PluginPage pageNav={{ text: 'Home' }}>
Expand Down
2 changes: 1 addition & 1 deletion src/scenes/MULTIHTTP/distinctTargets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function getDistinctTargets(metrics: DataSourceRef) {
body: new ExplorablePanel({
$data: getQueryRunner(metrics),
pluginId: 'stat',
title: 'Number of distinct targets',
title: 'Distinct targets',
}),
});
}
70 changes: 70 additions & 0 deletions src/scenes/SCRIPTED/dataTransferred.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { SceneFlexItem, SceneFlexLayout, SceneQueryRunner } from '@grafana/scenes';
import { DataSourceRef } from '@grafana/schema';

import { ExplorablePanel } from 'scenes/ExplorablePanel';

function getSentQueryRunner(metrics: DataSourceRef) {
return new SceneQueryRunner({
datasource: metrics,
queries: [
{
expr: `probe_data_sent_bytes{job="$job", instance="$instance"}`,
instant: false,
legendFormat: '{{ probe }}',
range: true,
refId: 'B',
},
],
});
}

function getReceivedQueryRunner(metrics: DataSourceRef) {
return new SceneQueryRunner({
datasource: metrics,
queries: [
{
expr: `probe_data_received_bytes{job="$job", instance="$instance"}`,
instant: false,
legendFormat: '{{ probe }}',
range: true,
refId: 'A',
},
],
});
}

export function getDataTransferred(metrics: DataSourceRef) {
return new SceneFlexLayout({
height: 200,
children: [
new SceneFlexItem({
width: '50%',
body: new ExplorablePanel({
$data: getSentQueryRunner(metrics),
pluginId: 'timeseries',
title: 'Data sent',
fieldConfig: {
defaults: {
unit: 'decbytes',
},
overrides: [],
},
}),
}),
new SceneFlexItem({
width: '50%',
body: new ExplorablePanel({
$data: getReceivedQueryRunner(metrics),
pluginId: 'timeseries',
title: 'Data received',
fieldConfig: {
defaults: {
unit: 'decbytes',
},
overrides: [],
},
}),
}),
],
});
}
64 changes: 64 additions & 0 deletions src/scenes/SCRIPTED/expectedResponse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { SceneFlexItem, SceneQueryRunner } from '@grafana/scenes';
import { DataSourceRef } from '@grafana/schema';

import { ExplorablePanel } from 'scenes/ExplorablePanel';

function getQueryRunner(metrics: DataSourceRef) {
return new SceneQueryRunner({
datasource: metrics,
queries: [
{
expr: `
sum by (name) (probe_http_got_expected_response{job="$job", instance="$instance"})
/
count by (name) (probe_http_got_expected_response{job="$job", instance="$instance"})`,
format: 'table',
instant: true,
legendFormat: '{{ name }}',
range: false,
refId: 'B',
},
],
});
}

export function getExpectedResponse(metrics: DataSourceRef) {
return new SceneFlexItem({
body: new ExplorablePanel({
$data: getQueryRunner(metrics),
pluginId: 'table',
title: 'Expected response by target',
fieldConfig: {
defaults: {
unit: 'percentunit',
},
overrides: [
{
matcher: {
id: 'byName',
options: 'Time',
},
properties: [
{
id: 'custom.hidden',
value: true,
},
],
},
{
matcher: {
id: 'byName',
options: 'Value',
},
properties: [
{
id: 'displayName',
value: 'Expected status received',
},
],
},
],
},
}),
});
}
21 changes: 21 additions & 0 deletions src/scenes/SCRIPTED/scriptedScene.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ import { getAssertionTable } from 'scenes/MULTIHTTP/assertionTable';
import { getDistinctTargets } from 'scenes/MULTIHTTP/distinctTargets';
import { getProbeDuration } from 'scenes/MULTIHTTP/probeDuration';

import { getDataTransferred } from './dataTransferred';
import { getExpectedResponse } from './expectedResponse';
import { getSuccessRateByUrl } from './successRateByUrl';
import { getTimingByTarget } from './timingByTarget';

export function getScriptedScene({ metrics, logs }: DashboardSceneAppConfig, checks: Check[] = []) {
return () => {
if (checks.length === 0) {
Expand Down Expand Up @@ -67,6 +72,22 @@ export function getScriptedScene({ metrics, logs }: DashboardSceneAppConfig, che
height: 200,
children: [probeDuration],
}),
getDataTransferred(metrics),
new SceneFlexLayout({
direction: 'row',
height: 200,
children: [getTimingByTarget(metrics)],
}),
new SceneFlexLayout({
direction: 'row',
height: 400,
children: [getExpectedResponse(metrics)],
}),
new SceneFlexLayout({
direction: 'row',
height: 200,
children: [getSuccessRateByUrl(metrics)],
}),
new SceneFlexLayout({
direction: 'row',
minHeight: 300,
Expand Down
40 changes: 40 additions & 0 deletions src/scenes/SCRIPTED/successRateByUrl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { SceneFlexItem, SceneQueryRunner } from '@grafana/scenes';
import { DataSourceRef } from '@grafana/schema';

import { ExplorablePanel } from 'scenes/ExplorablePanel';

function getQueryRunner(metrics: DataSourceRef) {
return new SceneQueryRunner({
datasource: metrics,
queries: [
{
refId: 'A',
expr: `
sum by (name) (probe_http_requests_total{job="$job", instance="$instance"})
/
count by (name) (probe_http_requests_total{job="$job", instance="$instance"})`,
range: true,
instant: false,
legendFormat: '{{ name }}',
format: 'time_series',
},
],
});
}

export function getSuccessRateByUrl(metrics: DataSourceRef) {
return new SceneFlexItem({
body: new ExplorablePanel({
$data: getQueryRunner(metrics),
pluginId: 'timeseries',
title: 'Success rate by target',
fieldConfig: {
defaults: {
unit: 'percentunit',
max: 1,
},
overrides: [],
},
}),
});
}
34 changes: 34 additions & 0 deletions src/scenes/SCRIPTED/timingByTarget.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { SceneFlexItem, SceneQueryRunner } from '@grafana/scenes';
import { DataSourceRef } from '@grafana/schema';

import { ExplorablePanel } from 'scenes/ExplorablePanel';

function getQueryRunner(metrics: DataSourceRef) {
return new SceneQueryRunner({
datasource: metrics,
queries: [
{
refId: 'A',
expr: 'sum by(name)(rate(probe_http_duration_seconds{job="$job", instance="$instance"}[5m]))',
range: true,
legendFormat: '{{ name }}',
format: 'time_series',
},
],
});
}
export function getTimingByTarget(metrics: DataSourceRef) {
return new SceneFlexItem({
body: new ExplorablePanel({
$data: getQueryRunner(metrics),
pluginId: 'timeseries',
title: 'Timing by target',
fieldConfig: {
defaults: {
unit: 's',
},
overrides: [],
},
}),
});
}

0 comments on commit 2d1d40e

Please sign in to comment.