datadog-frontend-toolkit 1.0.35 → 1.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/resources/ResourceProvisioner.js +4 -32
- package/dist/cjs/resources/ResourceProvisioner.js.map +1 -1
- package/dist/cjs/resources/templates/slos.js +58 -45
- package/dist/cjs/resources/templates/slos.js.map +1 -1
- package/dist/esm/resources/ResourceProvisioner.js +5 -33
- package/dist/esm/resources/ResourceProvisioner.js.map +1 -1
- package/dist/esm/resources/templates/slos.js +58 -44
- package/dist/esm/resources/templates/slos.js.map +1 -1
- package/dist/resources/ResourceProvisioner.js +4 -32
- package/dist/resources/ResourceProvisioner.js.map +1 -1
- package/dist/resources/templates/slos.js +58 -45
- package/dist/resources/templates/slos.js.map +1 -1
- package/dist/types/resources/ResourceProvisioner.d.ts +0 -5
- package/dist/types/resources/ResourceProvisioner.d.ts.map +1 -1
- package/dist/types/resources/templates/slos.d.ts +10 -20
- package/dist/types/resources/templates/slos.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -53,9 +53,8 @@ class ResourceProvisioner {
|
|
|
53
53
|
result.monitors.push(...monitorResults.created);
|
|
54
54
|
result.errors.push(...monitorResults.errors);
|
|
55
55
|
}
|
|
56
|
-
// SLOs (metric-based
|
|
56
|
+
// SLOs (metric-based and time-slice)
|
|
57
57
|
if (config.slos !== false) {
|
|
58
|
-
await this.ensureRumMetrics();
|
|
59
58
|
const sloResults = await this.provisionSlos(service, env, result.monitors, config.team, force);
|
|
60
59
|
result.slos.push(...sloResults.created);
|
|
61
60
|
result.errors.push(...sloResults.errors);
|
|
@@ -133,6 +132,9 @@ class ResourceProvisioner {
|
|
|
133
132
|
if (template.query) {
|
|
134
133
|
sloPayload.query = template.query;
|
|
135
134
|
}
|
|
135
|
+
if (template.sli_specification) {
|
|
136
|
+
sloPayload.sli_specification = template.sli_specification;
|
|
137
|
+
}
|
|
136
138
|
if (existing && force) {
|
|
137
139
|
await this.apiRequest('PUT', `/v1/slo/${existing.id}`, sloPayload);
|
|
138
140
|
created.push(existing);
|
|
@@ -220,36 +222,6 @@ class ResourceProvisioner {
|
|
|
220
222
|
}
|
|
221
223
|
return null;
|
|
222
224
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Ensures the RUM-generated metrics required by the SLOs exist.
|
|
225
|
-
* Creates them via POST /api/v2/rum/config/metrics; silently ignores 409 (already exists).
|
|
226
|
-
*/
|
|
227
|
-
async ensureRumMetrics() {
|
|
228
|
-
for (const metric of slos_1.RUM_METRIC_DEFINITIONS) {
|
|
229
|
-
try {
|
|
230
|
-
await this.apiRequest('POST', '/v2/rum/config/metrics', {
|
|
231
|
-
data: {
|
|
232
|
-
type: 'rum_metrics',
|
|
233
|
-
id: metric.id,
|
|
234
|
-
attributes: {
|
|
235
|
-
event_type: metric.event_type,
|
|
236
|
-
compute: { aggregation_type: 'count' },
|
|
237
|
-
filter: { query: metric.filter },
|
|
238
|
-
group_by: metric.group_by,
|
|
239
|
-
},
|
|
240
|
-
},
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
catch (err) {
|
|
244
|
-
// 409 = metric already exists — that's fine
|
|
245
|
-
if (err instanceof Error && err.message.includes('409'))
|
|
246
|
-
continue;
|
|
247
|
-
// Log but don't fail provisioning for metric creation errors
|
|
248
|
-
// eslint-disable-next-line no-console
|
|
249
|
-
console.warn(`⚠️ Could not create RUM metric ${metric.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
225
|
async apiRequest(method, path, body) {
|
|
254
226
|
return (0, retry_1.withRetry)(async () => {
|
|
255
227
|
const url = `${this.baseUrl}${path}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":";;;AACA,qDAA8D;AAC9D,mDAA6D;AAC7D,
|
|
1
|
+
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* SLO templates for Datadog API provisioning.
|
|
4
|
-
* Uses
|
|
4
|
+
* Uses only built-in RUM metrics so historical data is available immediately.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* SLO 1 — Frontend Availability (metric-based, event SLO)
|
|
7
|
+
* good = error-free views, total = all views
|
|
8
|
+
* Pattern mirrors the classic (total − errors) / total used for backend APIs.
|
|
9
|
+
*
|
|
10
|
+
* SLO 2 — Core Web Vitals / LCP (time-slice SLO)
|
|
11
|
+
* Measures % of 5-min windows where p75 LCP < 2.5 s (Google "good" threshold).
|
|
12
|
+
* Uses the existing rum.measure.view.largest_contentful_paint distribution metric.
|
|
10
13
|
*/
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.RUM_METRIC_DEFINITIONS = void 0;
|
|
13
15
|
exports.buildSloTemplates = buildSloTemplates;
|
|
14
|
-
exports.RUM_METRIC_DEFINITIONS = [
|
|
15
|
-
{
|
|
16
|
-
id: 'rum.frontend_toolkit.api_total',
|
|
17
|
-
event_type: 'resource',
|
|
18
|
-
filter: '@resource.type:(xhr OR fetch)',
|
|
19
|
-
group_by: [
|
|
20
|
-
{ path: 'service', tag_name: 'service' },
|
|
21
|
-
{ path: 'env', tag_name: 'env' },
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: 'rum.frontend_toolkit.api_errors',
|
|
26
|
-
event_type: 'resource',
|
|
27
|
-
filter: '@resource.type:(xhr OR fetch) @resource.status_code:>=400',
|
|
28
|
-
group_by: [
|
|
29
|
-
{ path: 'service', tag_name: 'service' },
|
|
30
|
-
{ path: 'env', tag_name: 'env' },
|
|
31
|
-
],
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
id: 'rum.frontend_toolkit.good_lcp',
|
|
35
|
-
event_type: 'view',
|
|
36
|
-
filter: '@view.largest_contentful_paint:<2500000000',
|
|
37
|
-
group_by: [
|
|
38
|
-
{ path: 'service', tag_name: 'service' },
|
|
39
|
-
{ path: 'env', tag_name: 'env' },
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
16
|
function buildSloTemplates(service, env, _monitorIds, team) {
|
|
44
17
|
const tags = [
|
|
45
18
|
`service:${service}`,
|
|
@@ -48,13 +21,39 @@ function buildSloTemplates(service, env, _monitorIds, team) {
|
|
|
48
21
|
...(team ? [`team:${team}`] : []),
|
|
49
22
|
];
|
|
50
23
|
return [
|
|
24
|
+
// SLO 1: API Availability — % of 5-min windows where API success rate > 99%
|
|
25
|
+
// Uses RUM resource events directly (same data source as dashboard endpoint widgets)
|
|
51
26
|
{
|
|
52
27
|
name: `${service} (${env}) - API Availability`,
|
|
53
|
-
description: 'Measures API request availability as the ratio of successful
|
|
54
|
-
type: '
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
28
|
+
description: 'Measures API request availability as the ratio of successful XHR/fetch calls (status < 400) to total calls, evaluated per 5-minute window. Managed by datadog-frontend-toolkit.',
|
|
29
|
+
type: 'time_slice',
|
|
30
|
+
sli_specification: {
|
|
31
|
+
time_slice: {
|
|
32
|
+
query: {
|
|
33
|
+
formulas: [{ formula: '1 - (query2 / query1)' }],
|
|
34
|
+
queries: [
|
|
35
|
+
{
|
|
36
|
+
data_source: 'rum',
|
|
37
|
+
name: 'query1',
|
|
38
|
+
compute: { aggregation: 'count' },
|
|
39
|
+
search: { query: `service:${service} env:${env} @type:resource @resource.type:(xhr OR fetch)` },
|
|
40
|
+
indexes: ['*'],
|
|
41
|
+
group_by: [],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
data_source: 'rum',
|
|
45
|
+
name: 'query2',
|
|
46
|
+
compute: { aggregation: 'count' },
|
|
47
|
+
search: { query: `service:${service} env:${env} @type:resource @resource.type:(xhr OR fetch) @resource.status_code:>=400` },
|
|
48
|
+
indexes: ['*'],
|
|
49
|
+
group_by: [],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
comparator: '>',
|
|
54
|
+
threshold: 0.99,
|
|
55
|
+
query_interval_seconds: 300,
|
|
56
|
+
},
|
|
58
57
|
},
|
|
59
58
|
thresholds: [
|
|
60
59
|
{ timeframe: '7d', target: 99.5, warning: 99.9 },
|
|
@@ -62,13 +61,27 @@ function buildSloTemplates(service, env, _monitorIds, team) {
|
|
|
62
61
|
],
|
|
63
62
|
tags,
|
|
64
63
|
},
|
|
64
|
+
// SLO 2: Core Web Vitals (LCP) — % of 5-min windows with p75 LCP < 2.5 s
|
|
65
65
|
{
|
|
66
66
|
name: `${service} (${env}) - Core Web Vitals (LCP)`,
|
|
67
|
-
description: 'Measures the percentage of
|
|
68
|
-
type: '
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
description: 'Measures the percentage of time where p75 Largest Contentful Paint stays below 2.5 s (Google Core Web Vitals "good" threshold). Managed by datadog-frontend-toolkit.',
|
|
68
|
+
type: 'time_slice',
|
|
69
|
+
sli_specification: {
|
|
70
|
+
time_slice: {
|
|
71
|
+
query: {
|
|
72
|
+
formulas: [{ formula: 'query1' }],
|
|
73
|
+
queries: [
|
|
74
|
+
{
|
|
75
|
+
data_source: 'metrics',
|
|
76
|
+
name: 'query1',
|
|
77
|
+
query: `p75:rum.measure.view.largest_contentful_paint{service:${service},env:${env}}`,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
comparator: '<',
|
|
82
|
+
threshold: 2500000000,
|
|
83
|
+
query_interval_seconds: 300,
|
|
84
|
+
},
|
|
72
85
|
},
|
|
73
86
|
thresholds: [
|
|
74
87
|
{ timeframe: '7d', target: 75, warning: 90 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slos.js","sourceRoot":"","sources":["../../../../src/resources/templates/slos.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"slos.js","sourceRoot":"","sources":["../../../../src/resources/templates/slos.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAeH,8CAqFC;AArFD,SAAgB,iBAAiB,CAC/B,OAAe,EACf,GAAW,EACX,WAA2C,EAC3C,IAAa;IAEb,MAAM,IAAI,GAAG;QACX,WAAW,OAAO,EAAE;QACpB,OAAO,GAAG,EAAE;QACZ,kCAAkC;QAClC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC;IAEF,OAAO;QACL,4EAA4E;QAC5E,qFAAqF;QACrF;YACE,IAAI,EAAE,GAAG,OAAO,KAAK,GAAG,sBAAsB;YAC9C,WAAW,EACT,iLAAiL;YACnL,IAAI,EAAE,YAAY;YAClB,iBAAiB,EAAE;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;wBAChD,OAAO,EAAE;4BACP;gCACE,WAAW,EAAE,KAAK;gCAClB,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gCACjC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,OAAO,QAAQ,GAAG,+CAA+C,EAAE;gCAC/F,OAAO,EAAE,CAAC,GAAG,CAAC;gCACd,QAAQ,EAAE,EAAE;6BACb;4BACD;gCACE,WAAW,EAAE,KAAK;gCAClB,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gCACjC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,OAAO,QAAQ,GAAG,2EAA2E,EAAE;gCAC3H,OAAO,EAAE,CAAC,GAAG,CAAC;gCACd,QAAQ,EAAE,EAAE;6BACb;yBACF;qBACF;oBACD,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,IAAI;oBACf,sBAAsB,EAAE,GAAG;iBAC5B;aACF;YACD,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;gBAChD,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;aAClD;YACD,IAAI;SACL;QACD,yEAAyE;QACzE;YACE,IAAI,EAAE,GAAG,OAAO,KAAK,GAAG,2BAA2B;YACnD,WAAW,EACT,sKAAsK;YACxK,IAAI,EAAE,YAAY;YAClB,iBAAiB,EAAE;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;wBACjC,OAAO,EAAE;4BACP;gCACE,WAAW,EAAE,SAAS;gCACtB,IAAI,EAAE,QAAQ;gCACd,KAAK,EAAE,yDAAyD,OAAO,QAAQ,GAAG,GAAG;6BACtF;yBACF;qBACF;oBACD,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,UAAU;oBACrB,sBAAsB,EAAE,GAAG;iBAC5B;aACF;YACD,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC5C,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aAC9C;YACD,IAAI;SACL;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildDashboardPayload } from './templates/dashboard';
|
|
2
2
|
import { buildMonitorTemplates } from './templates/monitors';
|
|
3
|
-
import { buildSloTemplates
|
|
3
|
+
import { buildSloTemplates } from './templates/slos';
|
|
4
4
|
import { withRetry } from '../utils/retry';
|
|
5
5
|
const MANAGED_TAG = 'managed:datadog-frontend-toolkit';
|
|
6
6
|
/**
|
|
@@ -50,9 +50,8 @@ export class ResourceProvisioner {
|
|
|
50
50
|
result.monitors.push(...monitorResults.created);
|
|
51
51
|
result.errors.push(...monitorResults.errors);
|
|
52
52
|
}
|
|
53
|
-
// SLOs (metric-based
|
|
53
|
+
// SLOs (metric-based and time-slice)
|
|
54
54
|
if (config.slos !== false) {
|
|
55
|
-
await this.ensureRumMetrics();
|
|
56
55
|
const sloResults = await this.provisionSlos(service, env, result.monitors, config.team, force);
|
|
57
56
|
result.slos.push(...sloResults.created);
|
|
58
57
|
result.errors.push(...sloResults.errors);
|
|
@@ -130,6 +129,9 @@ export class ResourceProvisioner {
|
|
|
130
129
|
if (template.query) {
|
|
131
130
|
sloPayload.query = template.query;
|
|
132
131
|
}
|
|
132
|
+
if (template.sli_specification) {
|
|
133
|
+
sloPayload.sli_specification = template.sli_specification;
|
|
134
|
+
}
|
|
133
135
|
if (existing && force) {
|
|
134
136
|
await this.apiRequest('PUT', `/v1/slo/${existing.id}`, sloPayload);
|
|
135
137
|
created.push(existing);
|
|
@@ -217,36 +219,6 @@ export class ResourceProvisioner {
|
|
|
217
219
|
}
|
|
218
220
|
return null;
|
|
219
221
|
}
|
|
220
|
-
/**
|
|
221
|
-
* Ensures the RUM-generated metrics required by the SLOs exist.
|
|
222
|
-
* Creates them via POST /api/v2/rum/config/metrics; silently ignores 409 (already exists).
|
|
223
|
-
*/
|
|
224
|
-
async ensureRumMetrics() {
|
|
225
|
-
for (const metric of RUM_METRIC_DEFINITIONS) {
|
|
226
|
-
try {
|
|
227
|
-
await this.apiRequest('POST', '/v2/rum/config/metrics', {
|
|
228
|
-
data: {
|
|
229
|
-
type: 'rum_metrics',
|
|
230
|
-
id: metric.id,
|
|
231
|
-
attributes: {
|
|
232
|
-
event_type: metric.event_type,
|
|
233
|
-
compute: { aggregation_type: 'count' },
|
|
234
|
-
filter: { query: metric.filter },
|
|
235
|
-
group_by: metric.group_by,
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
catch (err) {
|
|
241
|
-
// 409 = metric already exists — that's fine
|
|
242
|
-
if (err instanceof Error && err.message.includes('409'))
|
|
243
|
-
continue;
|
|
244
|
-
// Log but don't fail provisioning for metric creation errors
|
|
245
|
-
// eslint-disable-next-line no-console
|
|
246
|
-
console.warn(`⚠️ Could not create RUM metric ${metric.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
222
|
async apiRequest(method, path, body) {
|
|
251
223
|
return withRetry(async () => {
|
|
252
224
|
const url = `${this.baseUrl}${path}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SLO templates for Datadog API provisioning.
|
|
3
|
-
* Uses
|
|
3
|
+
* Uses only built-in RUM metrics so historical data is available immediately.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* SLO 1 — Frontend Availability (metric-based, event SLO)
|
|
6
|
+
* good = error-free views, total = all views
|
|
7
|
+
* Pattern mirrors the classic (total − errors) / total used for backend APIs.
|
|
8
|
+
*
|
|
9
|
+
* SLO 2 — Core Web Vitals / LCP (time-slice SLO)
|
|
10
|
+
* Measures % of 5-min windows where p75 LCP < 2.5 s (Google "good" threshold).
|
|
11
|
+
* Uses the existing rum.measure.view.largest_contentful_paint distribution metric.
|
|
9
12
|
*/
|
|
10
|
-
export const RUM_METRIC_DEFINITIONS = [
|
|
11
|
-
{
|
|
12
|
-
id: 'rum.frontend_toolkit.api_total',
|
|
13
|
-
event_type: 'resource',
|
|
14
|
-
filter: '@resource.type:(xhr OR fetch)',
|
|
15
|
-
group_by: [
|
|
16
|
-
{ path: 'service', tag_name: 'service' },
|
|
17
|
-
{ path: 'env', tag_name: 'env' },
|
|
18
|
-
],
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
id: 'rum.frontend_toolkit.api_errors',
|
|
22
|
-
event_type: 'resource',
|
|
23
|
-
filter: '@resource.type:(xhr OR fetch) @resource.status_code:>=400',
|
|
24
|
-
group_by: [
|
|
25
|
-
{ path: 'service', tag_name: 'service' },
|
|
26
|
-
{ path: 'env', tag_name: 'env' },
|
|
27
|
-
],
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: 'rum.frontend_toolkit.good_lcp',
|
|
31
|
-
event_type: 'view',
|
|
32
|
-
filter: '@view.largest_contentful_paint:<2500000000',
|
|
33
|
-
group_by: [
|
|
34
|
-
{ path: 'service', tag_name: 'service' },
|
|
35
|
-
{ path: 'env', tag_name: 'env' },
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
];
|
|
39
13
|
export function buildSloTemplates(service, env, _monitorIds, team) {
|
|
40
14
|
const tags = [
|
|
41
15
|
`service:${service}`,
|
|
@@ -44,13 +18,39 @@ export function buildSloTemplates(service, env, _monitorIds, team) {
|
|
|
44
18
|
...(team ? [`team:${team}`] : []),
|
|
45
19
|
];
|
|
46
20
|
return [
|
|
21
|
+
// SLO 1: API Availability — % of 5-min windows where API success rate > 99%
|
|
22
|
+
// Uses RUM resource events directly (same data source as dashboard endpoint widgets)
|
|
47
23
|
{
|
|
48
24
|
name: `${service} (${env}) - API Availability`,
|
|
49
|
-
description: 'Measures API request availability as the ratio of successful
|
|
50
|
-
type: '
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
25
|
+
description: 'Measures API request availability as the ratio of successful XHR/fetch calls (status < 400) to total calls, evaluated per 5-minute window. Managed by datadog-frontend-toolkit.',
|
|
26
|
+
type: 'time_slice',
|
|
27
|
+
sli_specification: {
|
|
28
|
+
time_slice: {
|
|
29
|
+
query: {
|
|
30
|
+
formulas: [{ formula: '1 - (query2 / query1)' }],
|
|
31
|
+
queries: [
|
|
32
|
+
{
|
|
33
|
+
data_source: 'rum',
|
|
34
|
+
name: 'query1',
|
|
35
|
+
compute: { aggregation: 'count' },
|
|
36
|
+
search: { query: `service:${service} env:${env} @type:resource @resource.type:(xhr OR fetch)` },
|
|
37
|
+
indexes: ['*'],
|
|
38
|
+
group_by: [],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
data_source: 'rum',
|
|
42
|
+
name: 'query2',
|
|
43
|
+
compute: { aggregation: 'count' },
|
|
44
|
+
search: { query: `service:${service} env:${env} @type:resource @resource.type:(xhr OR fetch) @resource.status_code:>=400` },
|
|
45
|
+
indexes: ['*'],
|
|
46
|
+
group_by: [],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
comparator: '>',
|
|
51
|
+
threshold: 0.99,
|
|
52
|
+
query_interval_seconds: 300,
|
|
53
|
+
},
|
|
54
54
|
},
|
|
55
55
|
thresholds: [
|
|
56
56
|
{ timeframe: '7d', target: 99.5, warning: 99.9 },
|
|
@@ -58,13 +58,27 @@ export function buildSloTemplates(service, env, _monitorIds, team) {
|
|
|
58
58
|
],
|
|
59
59
|
tags,
|
|
60
60
|
},
|
|
61
|
+
// SLO 2: Core Web Vitals (LCP) — % of 5-min windows with p75 LCP < 2.5 s
|
|
61
62
|
{
|
|
62
63
|
name: `${service} (${env}) - Core Web Vitals (LCP)`,
|
|
63
|
-
description: 'Measures the percentage of
|
|
64
|
-
type: '
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
description: 'Measures the percentage of time where p75 Largest Contentful Paint stays below 2.5 s (Google Core Web Vitals "good" threshold). Managed by datadog-frontend-toolkit.',
|
|
65
|
+
type: 'time_slice',
|
|
66
|
+
sli_specification: {
|
|
67
|
+
time_slice: {
|
|
68
|
+
query: {
|
|
69
|
+
formulas: [{ formula: 'query1' }],
|
|
70
|
+
queries: [
|
|
71
|
+
{
|
|
72
|
+
data_source: 'metrics',
|
|
73
|
+
name: 'query1',
|
|
74
|
+
query: `p75:rum.measure.view.largest_contentful_paint{service:${service},env:${env}}`,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
comparator: '<',
|
|
79
|
+
threshold: 2500000000,
|
|
80
|
+
query_interval_seconds: 300,
|
|
81
|
+
},
|
|
68
82
|
},
|
|
69
83
|
thresholds: [
|
|
70
84
|
{ timeframe: '7d', target: 75, warning: 90 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slos.js","sourceRoot":"","sources":["../../../../src/resources/templates/slos.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"slos.js","sourceRoot":"","sources":["../../../../src/resources/templates/slos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,GAAW,EACX,WAA2C,EAC3C,IAAa;IAEb,MAAM,IAAI,GAAG;QACX,WAAW,OAAO,EAAE;QACpB,OAAO,GAAG,EAAE;QACZ,kCAAkC;QAClC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC;IAEF,OAAO;QACL,4EAA4E;QAC5E,qFAAqF;QACrF;YACE,IAAI,EAAE,GAAG,OAAO,KAAK,GAAG,sBAAsB;YAC9C,WAAW,EACT,iLAAiL;YACnL,IAAI,EAAE,YAAY;YAClB,iBAAiB,EAAE;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;wBAChD,OAAO,EAAE;4BACP;gCACE,WAAW,EAAE,KAAK;gCAClB,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gCACjC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,OAAO,QAAQ,GAAG,+CAA+C,EAAE;gCAC/F,OAAO,EAAE,CAAC,GAAG,CAAC;gCACd,QAAQ,EAAE,EAAE;6BACb;4BACD;gCACE,WAAW,EAAE,KAAK;gCAClB,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gCACjC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,OAAO,QAAQ,GAAG,2EAA2E,EAAE;gCAC3H,OAAO,EAAE,CAAC,GAAG,CAAC;gCACd,QAAQ,EAAE,EAAE;6BACb;yBACF;qBACF;oBACD,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,IAAI;oBACf,sBAAsB,EAAE,GAAG;iBAC5B;aACF;YACD,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;gBAChD,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;aAClD;YACD,IAAI;SACL;QACD,yEAAyE;QACzE;YACE,IAAI,EAAE,GAAG,OAAO,KAAK,GAAG,2BAA2B;YACnD,WAAW,EACT,sKAAsK;YACxK,IAAI,EAAE,YAAY;YAClB,iBAAiB,EAAE;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;wBACjC,OAAO,EAAE;4BACP;gCACE,WAAW,EAAE,SAAS;gCACtB,IAAI,EAAE,QAAQ;gCACd,KAAK,EAAE,yDAAyD,OAAO,QAAQ,GAAG,GAAG;6BACtF;yBACF;qBACF;oBACD,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,UAAU;oBACrB,sBAAsB,EAAE,GAAG;iBAC5B;aACF;YACD,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC5C,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aAC9C;YACD,IAAI;SACL;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -50,9 +50,8 @@ class ResourceProvisioner {
|
|
|
50
50
|
result.monitors.push(...monitorResults.created);
|
|
51
51
|
result.errors.push(...monitorResults.errors);
|
|
52
52
|
}
|
|
53
|
-
// SLOs (metric-based
|
|
53
|
+
// SLOs (metric-based and time-slice)
|
|
54
54
|
if (config.slos !== false) {
|
|
55
|
-
await this.ensureRumMetrics();
|
|
56
55
|
const sloResults = await this.provisionSlos(service, env, result.monitors, config.team, force);
|
|
57
56
|
result.slos.push(...sloResults.created);
|
|
58
57
|
result.errors.push(...sloResults.errors);
|
|
@@ -130,6 +129,9 @@ class ResourceProvisioner {
|
|
|
130
129
|
if (template.query) {
|
|
131
130
|
sloPayload.query = template.query;
|
|
132
131
|
}
|
|
132
|
+
if (template.sli_specification) {
|
|
133
|
+
sloPayload.sli_specification = template.sli_specification;
|
|
134
|
+
}
|
|
133
135
|
if (existing && force) {
|
|
134
136
|
await this.apiRequest('PUT', `/v1/slo/${existing.id}`, sloPayload);
|
|
135
137
|
created.push(existing);
|
|
@@ -217,36 +219,6 @@ class ResourceProvisioner {
|
|
|
217
219
|
}
|
|
218
220
|
return null;
|
|
219
221
|
}
|
|
220
|
-
/**
|
|
221
|
-
* Ensures the RUM-generated metrics required by the SLOs exist.
|
|
222
|
-
* Creates them via POST /api/v2/rum/config/metrics; silently ignores 409 (already exists).
|
|
223
|
-
*/
|
|
224
|
-
async ensureRumMetrics() {
|
|
225
|
-
for (const metric of slos_1.RUM_METRIC_DEFINITIONS) {
|
|
226
|
-
try {
|
|
227
|
-
await this.apiRequest('POST', '/v2/rum/config/metrics', {
|
|
228
|
-
data: {
|
|
229
|
-
type: 'rum_metrics',
|
|
230
|
-
id: metric.id,
|
|
231
|
-
attributes: {
|
|
232
|
-
event_type: metric.event_type,
|
|
233
|
-
compute: { aggregation_type: 'count' },
|
|
234
|
-
filter: { query: metric.filter },
|
|
235
|
-
group_by: metric.group_by,
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
catch (err) {
|
|
241
|
-
// 409 = metric already exists — that's fine
|
|
242
|
-
if (err instanceof Error && err.message.includes('409'))
|
|
243
|
-
continue;
|
|
244
|
-
// Log but don't fail provisioning for metric creation errors
|
|
245
|
-
// eslint-disable-next-line no-console
|
|
246
|
-
console.warn(`⚠️ Could not create RUM metric ${metric.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
222
|
async apiRequest(method, path, body) {
|
|
251
223
|
return (0, retry_1.withRetry)(async () => {
|
|
252
224
|
const url = `${this.baseUrl}${path}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":";;;AACA,qDAA8D;AAC9D,mDAA6D;AAC7D,
|
|
1
|
+
{"version":3,"file":"ResourceProvisioner.js","sourceRoot":"","sources":["../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* SLO templates for Datadog API provisioning.
|
|
4
|
-
* Uses
|
|
4
|
+
* Uses only built-in RUM metrics so historical data is available immediately.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* SLO 1 — Frontend Availability (metric-based, event SLO)
|
|
7
|
+
* good = error-free views, total = all views
|
|
8
|
+
* Pattern mirrors the classic (total − errors) / total used for backend APIs.
|
|
9
|
+
*
|
|
10
|
+
* SLO 2 — Core Web Vitals / LCP (time-slice SLO)
|
|
11
|
+
* Measures % of 5-min windows where p75 LCP < 2.5 s (Google "good" threshold).
|
|
12
|
+
* Uses the existing rum.measure.view.largest_contentful_paint distribution metric.
|
|
10
13
|
*/
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.RUM_METRIC_DEFINITIONS = void 0;
|
|
13
15
|
exports.buildSloTemplates = buildSloTemplates;
|
|
14
|
-
exports.RUM_METRIC_DEFINITIONS = [
|
|
15
|
-
{
|
|
16
|
-
id: 'rum.frontend_toolkit.api_total',
|
|
17
|
-
event_type: 'resource',
|
|
18
|
-
filter: '@resource.type:(xhr OR fetch)',
|
|
19
|
-
group_by: [
|
|
20
|
-
{ path: 'service', tag_name: 'service' },
|
|
21
|
-
{ path: 'env', tag_name: 'env' },
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: 'rum.frontend_toolkit.api_errors',
|
|
26
|
-
event_type: 'resource',
|
|
27
|
-
filter: '@resource.type:(xhr OR fetch) @resource.status_code:>=400',
|
|
28
|
-
group_by: [
|
|
29
|
-
{ path: 'service', tag_name: 'service' },
|
|
30
|
-
{ path: 'env', tag_name: 'env' },
|
|
31
|
-
],
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
id: 'rum.frontend_toolkit.good_lcp',
|
|
35
|
-
event_type: 'view',
|
|
36
|
-
filter: '@view.largest_contentful_paint:<2500000000',
|
|
37
|
-
group_by: [
|
|
38
|
-
{ path: 'service', tag_name: 'service' },
|
|
39
|
-
{ path: 'env', tag_name: 'env' },
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
16
|
function buildSloTemplates(service, env, _monitorIds, team) {
|
|
44
17
|
const tags = [
|
|
45
18
|
`service:${service}`,
|
|
@@ -48,13 +21,39 @@ function buildSloTemplates(service, env, _monitorIds, team) {
|
|
|
48
21
|
...(team ? [`team:${team}`] : []),
|
|
49
22
|
];
|
|
50
23
|
return [
|
|
24
|
+
// SLO 1: API Availability — % of 5-min windows where API success rate > 99%
|
|
25
|
+
// Uses RUM resource events directly (same data source as dashboard endpoint widgets)
|
|
51
26
|
{
|
|
52
27
|
name: `${service} (${env}) - API Availability`,
|
|
53
|
-
description: 'Measures API request availability as the ratio of successful
|
|
54
|
-
type: '
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
28
|
+
description: 'Measures API request availability as the ratio of successful XHR/fetch calls (status < 400) to total calls, evaluated per 5-minute window. Managed by datadog-frontend-toolkit.',
|
|
29
|
+
type: 'time_slice',
|
|
30
|
+
sli_specification: {
|
|
31
|
+
time_slice: {
|
|
32
|
+
query: {
|
|
33
|
+
formulas: [{ formula: '1 - (query2 / query1)' }],
|
|
34
|
+
queries: [
|
|
35
|
+
{
|
|
36
|
+
data_source: 'rum',
|
|
37
|
+
name: 'query1',
|
|
38
|
+
compute: { aggregation: 'count' },
|
|
39
|
+
search: { query: `service:${service} env:${env} @type:resource @resource.type:(xhr OR fetch)` },
|
|
40
|
+
indexes: ['*'],
|
|
41
|
+
group_by: [],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
data_source: 'rum',
|
|
45
|
+
name: 'query2',
|
|
46
|
+
compute: { aggregation: 'count' },
|
|
47
|
+
search: { query: `service:${service} env:${env} @type:resource @resource.type:(xhr OR fetch) @resource.status_code:>=400` },
|
|
48
|
+
indexes: ['*'],
|
|
49
|
+
group_by: [],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
comparator: '>',
|
|
54
|
+
threshold: 0.99,
|
|
55
|
+
query_interval_seconds: 300,
|
|
56
|
+
},
|
|
58
57
|
},
|
|
59
58
|
thresholds: [
|
|
60
59
|
{ timeframe: '7d', target: 99.5, warning: 99.9 },
|
|
@@ -62,13 +61,27 @@ function buildSloTemplates(service, env, _monitorIds, team) {
|
|
|
62
61
|
],
|
|
63
62
|
tags,
|
|
64
63
|
},
|
|
64
|
+
// SLO 2: Core Web Vitals (LCP) — % of 5-min windows with p75 LCP < 2.5 s
|
|
65
65
|
{
|
|
66
66
|
name: `${service} (${env}) - Core Web Vitals (LCP)`,
|
|
67
|
-
description: 'Measures the percentage of
|
|
68
|
-
type: '
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
description: 'Measures the percentage of time where p75 Largest Contentful Paint stays below 2.5 s (Google Core Web Vitals "good" threshold). Managed by datadog-frontend-toolkit.',
|
|
68
|
+
type: 'time_slice',
|
|
69
|
+
sli_specification: {
|
|
70
|
+
time_slice: {
|
|
71
|
+
query: {
|
|
72
|
+
formulas: [{ formula: 'query1' }],
|
|
73
|
+
queries: [
|
|
74
|
+
{
|
|
75
|
+
data_source: 'metrics',
|
|
76
|
+
name: 'query1',
|
|
77
|
+
query: `p75:rum.measure.view.largest_contentful_paint{service:${service},env:${env}}`,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
comparator: '<',
|
|
82
|
+
threshold: 2500000000,
|
|
83
|
+
query_interval_seconds: 300,
|
|
84
|
+
},
|
|
72
85
|
},
|
|
73
86
|
thresholds: [
|
|
74
87
|
{ timeframe: '7d', target: 75, warning: 90 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slos.js","sourceRoot":"","sources":["../../../src/resources/templates/slos.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"slos.js","sourceRoot":"","sources":["../../../src/resources/templates/slos.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAeH,8CAqFC;AArFD,SAAgB,iBAAiB,CAC/B,OAAe,EACf,GAAW,EACX,WAA2C,EAC3C,IAAa;IAEb,MAAM,IAAI,GAAG;QACX,WAAW,OAAO,EAAE;QACpB,OAAO,GAAG,EAAE;QACZ,kCAAkC;QAClC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC;IAEF,OAAO;QACL,4EAA4E;QAC5E,qFAAqF;QACrF;YACE,IAAI,EAAE,GAAG,OAAO,KAAK,GAAG,sBAAsB;YAC9C,WAAW,EACT,iLAAiL;YACnL,IAAI,EAAE,YAAY;YAClB,iBAAiB,EAAE;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;wBAChD,OAAO,EAAE;4BACP;gCACE,WAAW,EAAE,KAAK;gCAClB,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gCACjC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,OAAO,QAAQ,GAAG,+CAA+C,EAAE;gCAC/F,OAAO,EAAE,CAAC,GAAG,CAAC;gCACd,QAAQ,EAAE,EAAE;6BACb;4BACD;gCACE,WAAW,EAAE,KAAK;gCAClB,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gCACjC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,OAAO,QAAQ,GAAG,2EAA2E,EAAE;gCAC3H,OAAO,EAAE,CAAC,GAAG,CAAC;gCACd,QAAQ,EAAE,EAAE;6BACb;yBACF;qBACF;oBACD,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,IAAI;oBACf,sBAAsB,EAAE,GAAG;iBAC5B;aACF;YACD,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;gBAChD,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;aAClD;YACD,IAAI;SACL;QACD,yEAAyE;QACzE;YACE,IAAI,EAAE,GAAG,OAAO,KAAK,GAAG,2BAA2B;YACnD,WAAW,EACT,sKAAsK;YACxK,IAAI,EAAE,YAAY;YAClB,iBAAiB,EAAE;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;wBACjC,OAAO,EAAE;4BACP;gCACE,WAAW,EAAE,SAAS;gCACtB,IAAI,EAAE,QAAQ;gCACd,KAAK,EAAE,yDAAyD,OAAO,QAAQ,GAAG,GAAG;6BACtF;yBACF;qBACF;oBACD,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,UAAU;oBACrB,sBAAsB,EAAE,GAAG;iBAC5B;aACF;YACD,UAAU,EAAE;gBACV,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC5C,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aAC9C;YACD,IAAI;SACL;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -40,11 +40,6 @@ export declare class ResourceProvisioner {
|
|
|
40
40
|
private findExistingDashboard;
|
|
41
41
|
private findExistingMonitor;
|
|
42
42
|
private findExistingSlo;
|
|
43
|
-
/**
|
|
44
|
-
* Ensures the RUM-generated metrics required by the SLOs exist.
|
|
45
|
-
* Creates them via POST /api/v2/rum/config/metrics; silently ignores 409 (already exists).
|
|
46
|
-
*/
|
|
47
|
-
private ensureRumMetrics;
|
|
48
43
|
private apiRequest;
|
|
49
44
|
}
|
|
50
45
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceProvisioner.d.ts","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAM1D,UAAU,kBAAkB;IAC1B,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,kBAAkB;IAMtC;;;OAGG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ResourceProvisioner.d.ts","sourceRoot":"","sources":["../../../src/resources/ResourceProvisioner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAM1D,UAAU,kBAAkB;IAC1B,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,kBAAkB;IAMtC;;;OAGG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC;YAqChB,kBAAkB;YA8BlB,iBAAiB;YAkDjB,aAAa;YAwDb,qBAAqB;YA6BrB,mBAAmB;YAqCnB,eAAe;YAkCf,UAAU;CAwCzB"}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SLO templates for Datadog API provisioning.
|
|
3
|
-
* Uses
|
|
3
|
+
* Uses only built-in RUM metrics so historical data is available immediately.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* SLO 1 — Frontend Availability (metric-based, event SLO)
|
|
6
|
+
* good = error-free views, total = all views
|
|
7
|
+
* Pattern mirrors the classic (total − errors) / total used for backend APIs.
|
|
8
|
+
*
|
|
9
|
+
* SLO 2 — Core Web Vitals / LCP (time-slice SLO)
|
|
10
|
+
* Measures % of 5-min windows where p75 LCP < 2.5 s (Google "good" threshold).
|
|
11
|
+
* Uses the existing rum.measure.view.largest_contentful_paint distribution metric.
|
|
9
12
|
*/
|
|
10
13
|
export interface SloTemplate {
|
|
11
14
|
name: string;
|
|
12
15
|
description: string;
|
|
13
|
-
type:
|
|
16
|
+
type: 'metric' | 'time_slice';
|
|
14
17
|
query?: {
|
|
15
18
|
numerator: string;
|
|
16
19
|
denominator: string;
|
|
17
20
|
};
|
|
21
|
+
sli_specification?: Record<string, unknown>;
|
|
18
22
|
thresholds: Array<{
|
|
19
23
|
timeframe: string;
|
|
20
24
|
target: number;
|
|
@@ -22,20 +26,6 @@ export interface SloTemplate {
|
|
|
22
26
|
}>;
|
|
23
27
|
tags: string[];
|
|
24
28
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Definitions for the RUM-generated metrics the SLOs depend on.
|
|
27
|
-
* Each entry maps to a POST /api/v2/rum/config/metrics call.
|
|
28
|
-
*/
|
|
29
|
-
export interface RumMetricDefinition {
|
|
30
|
-
id: string;
|
|
31
|
-
event_type: string;
|
|
32
|
-
filter: string;
|
|
33
|
-
group_by: Array<{
|
|
34
|
-
path: string;
|
|
35
|
-
tag_name: string;
|
|
36
|
-
}>;
|
|
37
|
-
}
|
|
38
|
-
export declare const RUM_METRIC_DEFINITIONS: RumMetricDefinition[];
|
|
39
29
|
export declare function buildSloTemplates(service: string, env: string, _monitorIds: {
|
|
40
30
|
id: number;
|
|
41
31
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slos.d.ts","sourceRoot":"","sources":["../../../../src/resources/templates/slos.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"slos.d.ts","sourceRoot":"","sources":["../../../../src/resources/templates/slos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAC3C,IAAI,CAAC,EAAE,MAAM,GACZ,WAAW,EAAE,CAgFf"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datadog-frontend-toolkit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.37",
|
|
4
4
|
"description": "Enterprise-grade, framework-agnostic frontend observability toolkit for Datadog. Auto-instruments RUM, Logs, Error Tracking, Performance Monitoring, and provisions Dashboards, Monitors & SLOs.",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|