@oneuptime/common 12.0.20 → 12.0.21
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/Models/AnalyticsModels/ChangeEvent.ts +331 -0
- package/Models/AnalyticsModels/Index.ts +2 -0
- package/Server/EnvironmentConfig.ts +1 -8
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +0 -2
- package/Server/Services/ChangeEventService.ts +11 -0
- package/Server/Services/EnterpriseLicenseService.ts +3 -3
- package/Server/Services/Index.ts +2 -0
- package/Server/Utils/Attribution.ts +11 -11
- package/Server/Utils/Marketing/MarketingEventWebhook.ts +4 -5
- package/Server/Utils/Telemetry/ChangeEventRow.ts +228 -0
- package/Server/Views/Partials/AnalyticsConsent.ejs +3 -95
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +64 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +249 -0
- package/Tests/App/Dashboard/InvestigationArtifacts.test.tsx +315 -0
- package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +258 -0
- package/Tests/App/Dashboard/MetricChartsCompare.test.tsx +171 -0
- package/Tests/App/Dashboard/MetricViewCompare.test.tsx +233 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserSlackAndMicrosoftTeamsMigration.test.ts +236 -0
- package/Tests/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.test.ts +224 -0
- package/Tests/Server/Utils/Attribution.test.ts +4 -5
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +300 -0
- package/Tests/UI/Components/Charts/ChartGhostSeries.test.tsx +103 -0
- package/Tests/UI/Components/Charts/TooltipEntries.test.ts +44 -8
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +13 -2
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +7 -0
- package/Types/Marketing/Attribution.ts +9 -15
- package/Types/Marketing/MarketingEvent.ts +10 -46
- package/UI/Components/Charts/Area/AreaChart.tsx +15 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +16 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +189 -93
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +6 -1
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +213 -114
- package/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.ts +42 -27
- package/UI/Components/Charts/Line/LineChart.tsx +15 -0
- package/Utils/Metrics/MetricExplorerUrl.ts +119 -5
- package/Utils/Telemetry/CrossSignalScope.ts +19 -10
- package/build/dist/Models/AnalyticsModels/ChangeEvent.js +298 -0
- package/build/dist/Models/AnalyticsModels/ChangeEvent.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -7
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +0 -2
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/ChangeEventService.js +9 -0
- package/build/dist/Server/Services/ChangeEventService.js.map +1 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js +3 -3
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +6 -6
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js +4 -5
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ChangeEventRow.js +150 -0
- package/build/dist/Server/Utils/Telemetry/ChangeEventRow.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +7 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/Marketing/Attribution.js +9 -15
- package/build/dist/Types/Marketing/Attribution.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingEvent.js +2 -33
- package/build/dist/Types/Marketing/MarketingEvent.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +9 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +92 -38
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +8 -8
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +95 -37
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js +39 -24
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +81 -0
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +14 -8
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/package.json +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.ts +0 -117
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js +0 -106
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Dictionary from "../../Types/Dictionary";
|
|
2
|
+
import Includes from "../../Types/BaseDatabase/Includes";
|
|
2
3
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
3
4
|
import OneUptimeDate from "../../Types/Date";
|
|
4
5
|
import MetricFormulaConfigData from "../../Types/Metrics/MetricFormulaConfigData";
|
|
@@ -32,6 +33,15 @@ export enum MetricExplorerUrlParam {
|
|
|
32
33
|
* (which never had a range param) keep working as pinned windows.
|
|
33
34
|
*/
|
|
34
35
|
Range = "range",
|
|
36
|
+
/*
|
|
37
|
+
* One-shot service scope: a JSON array of Service ObjectID strings,
|
|
38
|
+
* emitted by cross-signal pivots (logs/traces -> metrics). The explorer
|
|
39
|
+
* resolves the ids to service names on load, folds them into every
|
|
40
|
+
* query's `resource.service.name` attribute filter (the metric store's
|
|
41
|
+
* service dimension), and then DELETES the param on its next write-back
|
|
42
|
+
* — the scope lives on as ordinary, user-editable attribute filters.
|
|
43
|
+
*/
|
|
44
|
+
Services = "services",
|
|
35
45
|
}
|
|
36
46
|
|
|
37
47
|
export interface SerializedMetricQueryAlias {
|
|
@@ -60,7 +70,7 @@ export interface SerializedMetricQuery {
|
|
|
60
70
|
* lettering (a, b, ...).
|
|
61
71
|
*/
|
|
62
72
|
variable?: string | undefined;
|
|
63
|
-
attributes?: Dictionary<
|
|
73
|
+
attributes?: Dictionary<SerializedMetricAttributeValue> | undefined;
|
|
64
74
|
aggregationType?: MetricsAggregationType | undefined;
|
|
65
75
|
alias?: SerializedMetricQueryAlias | undefined;
|
|
66
76
|
groupByAttributeKeys?: Array<string> | undefined;
|
|
@@ -90,7 +100,59 @@ export interface SerializedMetricFormula {
|
|
|
90
100
|
criticalThreshold?: number | undefined;
|
|
91
101
|
}
|
|
92
102
|
|
|
103
|
+
/*
|
|
104
|
+
* One attribute filter value inside the serialized `metricQueries` param.
|
|
105
|
+
* Scalars are equality filters; Includes is the "any of" membership the
|
|
106
|
+
* UI's operator layer and the query layer both understand. It JSON-
|
|
107
|
+
* serializes to {_type: "Includes", value: [...]} (its toJSON), which the
|
|
108
|
+
* parse side rebuilds into a real instance — that round trip is how a
|
|
109
|
+
* multi-service scope survives Copy Link and saved views.
|
|
110
|
+
*/
|
|
111
|
+
export type SerializedMetricAttributeValue =
|
|
112
|
+
| string
|
|
113
|
+
| number
|
|
114
|
+
| boolean
|
|
115
|
+
| Includes;
|
|
116
|
+
|
|
117
|
+
const MAX_SERVICES_PARAM_ENTRIES: number = 20;
|
|
118
|
+
|
|
93
119
|
export default class MetricExplorerUrl {
|
|
120
|
+
/**
|
|
121
|
+
* Parses the `services` param: a JSON array of non-empty strings,
|
|
122
|
+
* deduped, capped. Garbage yields [] — same defensive posture as the
|
|
123
|
+
* other param parsers.
|
|
124
|
+
*/
|
|
125
|
+
public static parseServicesParam(raw: string): Array<string> {
|
|
126
|
+
let parsedValue: unknown = null;
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
parsedValue = JSONFunctions.parse(raw);
|
|
130
|
+
} catch {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!Array.isArray(parsedValue)) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const serviceIds: Array<string> = [];
|
|
139
|
+
|
|
140
|
+
for (const entry of parsedValue) {
|
|
141
|
+
if (
|
|
142
|
+
typeof entry === "string" &&
|
|
143
|
+
entry.trim() !== "" &&
|
|
144
|
+
!serviceIds.includes(entry)
|
|
145
|
+
) {
|
|
146
|
+
serviceIds.push(entry);
|
|
147
|
+
}
|
|
148
|
+
if (serviceIds.length >= MAX_SERVICES_PARAM_ENTRIES) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return serviceIds;
|
|
154
|
+
}
|
|
155
|
+
|
|
94
156
|
/*
|
|
95
157
|
* Builds the full URL param dictionary for a metric-view state. Keys
|
|
96
158
|
* are only present when they carry a value (empty/meaningless queries
|
|
@@ -188,7 +250,7 @@ export default class MetricExplorerUrl {
|
|
|
188
250
|
const metricName: string =
|
|
189
251
|
typeof metricNameValue === "string" ? metricNameValue : "";
|
|
190
252
|
|
|
191
|
-
const attributes: Dictionary<
|
|
253
|
+
const attributes: Dictionary<SerializedMetricAttributeValue> =
|
|
192
254
|
MetricExplorerUrl.sanitizeAttributes(filterDataRecord["attributes"]);
|
|
193
255
|
|
|
194
256
|
const aggregationType: MetricsAggregationType | undefined =
|
|
@@ -336,7 +398,7 @@ export default class MetricExplorerUrl {
|
|
|
336
398
|
? (entryRecord["variable"] as string)
|
|
337
399
|
: undefined;
|
|
338
400
|
|
|
339
|
-
const attributes: Dictionary<
|
|
401
|
+
const attributes: Dictionary<SerializedMetricAttributeValue> =
|
|
340
402
|
MetricExplorerUrl.sanitizeAttributes(entryRecord["attributes"]);
|
|
341
403
|
|
|
342
404
|
const aggregationType: MetricsAggregationType | undefined =
|
|
@@ -552,7 +614,7 @@ export default class MetricExplorerUrl {
|
|
|
552
614
|
|
|
553
615
|
public static sanitizeAttributes(
|
|
554
616
|
value: unknown,
|
|
555
|
-
): Dictionary<
|
|
617
|
+
): Dictionary<SerializedMetricAttributeValue> {
|
|
556
618
|
if (value === null || value === undefined) {
|
|
557
619
|
return {};
|
|
558
620
|
}
|
|
@@ -575,7 +637,7 @@ export default class MetricExplorerUrl {
|
|
|
575
637
|
return {};
|
|
576
638
|
}
|
|
577
639
|
|
|
578
|
-
const attributes: Dictionary<
|
|
640
|
+
const attributes: Dictionary<SerializedMetricAttributeValue> = {};
|
|
579
641
|
|
|
580
642
|
for (const key in candidate as Record<string, unknown>) {
|
|
581
643
|
const attributeValue: unknown = (candidate as Record<string, unknown>)[
|
|
@@ -588,12 +650,64 @@ export default class MetricExplorerUrl {
|
|
|
588
650
|
typeof attributeValue === "boolean"
|
|
589
651
|
) {
|
|
590
652
|
attributes[key] = attributeValue;
|
|
653
|
+
continue;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/*
|
|
657
|
+
* "Any of" membership filters. Live view state holds Includes
|
|
658
|
+
* INSTANCES; parsed URLs hold the plain {_type, value} JSON shape.
|
|
659
|
+
* Both normalize to a fresh instance so multi-value filters (e.g.
|
|
660
|
+
* a multi-service scope) survive Copy Link / saved views instead
|
|
661
|
+
* of being silently dropped — and downstream consumers (the query
|
|
662
|
+
* layer, the operator detector, the monitor evaluator's deep-link
|
|
663
|
+
* builder) all already speak Includes.
|
|
664
|
+
*/
|
|
665
|
+
const membershipValues: Array<string> | null =
|
|
666
|
+
MetricExplorerUrl.getIncludesShapeValues(attributeValue);
|
|
667
|
+
|
|
668
|
+
if (membershipValues !== null && membershipValues.length > 0) {
|
|
669
|
+
attributes[key] = new Includes(membershipValues);
|
|
591
670
|
}
|
|
592
671
|
}
|
|
593
672
|
|
|
594
673
|
return attributes;
|
|
595
674
|
}
|
|
596
675
|
|
|
676
|
+
private static getIncludesShapeValues(value: unknown): Array<string> | null {
|
|
677
|
+
let rawValues: unknown = null;
|
|
678
|
+
|
|
679
|
+
if (value instanceof Includes) {
|
|
680
|
+
rawValues = value.values;
|
|
681
|
+
} else if (
|
|
682
|
+
value &&
|
|
683
|
+
typeof value === "object" &&
|
|
684
|
+
!Array.isArray(value) &&
|
|
685
|
+
(value as Record<string, unknown>)["_type"] === "Includes"
|
|
686
|
+
) {
|
|
687
|
+
rawValues = (value as Record<string, unknown>)["value"];
|
|
688
|
+
} else {
|
|
689
|
+
return null;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
if (!Array.isArray(rawValues)) {
|
|
693
|
+
return [];
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
const values: Array<string> = [];
|
|
697
|
+
|
|
698
|
+
for (const entry of rawValues) {
|
|
699
|
+
if (
|
|
700
|
+
(typeof entry === "string" && entry.trim() !== "") ||
|
|
701
|
+
typeof entry === "number" ||
|
|
702
|
+
typeof entry === "boolean"
|
|
703
|
+
) {
|
|
704
|
+
values.push(String(entry));
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
return values;
|
|
709
|
+
}
|
|
710
|
+
|
|
597
711
|
private static buildAliasFromMetricAliasData(
|
|
598
712
|
data: MetricQueryConfigData["metricAliasData"],
|
|
599
713
|
): SerializedMetricQueryAlias | undefined {
|
|
@@ -51,7 +51,9 @@ const WHITESPACE: RegExp = /\s/;
|
|
|
51
51
|
* - Metric explorer (Common/Utils/Metrics/MetricExplorerUrl.ts): the
|
|
52
52
|
* JSON-encoded `metricQueries` param plus absolute `startTime`/`endTime`
|
|
53
53
|
* (a pinned Custom window is represented by the absolute params alone —
|
|
54
|
-
* no `range` token)
|
|
54
|
+
* no `range` token), plus the one-shot `services` param (JSON array of
|
|
55
|
+
* Service ObjectID strings) that the explorer resolves to
|
|
56
|
+
* `resource.service.name` attribute filters on load.
|
|
55
57
|
*/
|
|
56
58
|
|
|
57
59
|
/**
|
|
@@ -535,11 +537,11 @@ export function toTracesExplorerQueryParams(
|
|
|
535
537
|
* Custom by the absolute params alone — see MetricExplorerUrl). The
|
|
536
538
|
* optional `metricName` argument names the query.
|
|
537
539
|
*
|
|
538
|
-
* Dropped:
|
|
539
|
-
*
|
|
540
|
-
*
|
|
541
|
-
*
|
|
542
|
-
*
|
|
540
|
+
* Dropped: resourceFacetSelections, traceIds, spanIds, severityTexts,
|
|
541
|
+
* bodyContains — the metric explorer's URL grammar has no resource /
|
|
542
|
+
* trace / span / severity / message dimension. serviceIds DO carry, via
|
|
543
|
+
* the `services` param the explorer folds into `resource.service.name`
|
|
544
|
+
* attribute filters on load.
|
|
543
545
|
*/
|
|
544
546
|
export function toMetricsExplorerQueryParams(
|
|
545
547
|
scope: TelemetryCrossSignalScope,
|
|
@@ -567,6 +569,17 @@ export function toMetricsExplorerQueryParams(
|
|
|
567
569
|
params[MetricExplorerUrlParam.MetricQueries] = JSON.stringify([query]);
|
|
568
570
|
}
|
|
569
571
|
|
|
572
|
+
/*
|
|
573
|
+
* Service scope rides the one-shot `services` param — the explorer
|
|
574
|
+
* resolves ids to names and folds them into `resource.service.name`
|
|
575
|
+
* attribute filters on load, so serviceIds is no longer dropped.
|
|
576
|
+
*/
|
|
577
|
+
const scopedServiceIds: Array<string> = sanitizeValues(scope.serviceIds);
|
|
578
|
+
|
|
579
|
+
if (scopedServiceIds.length > 0) {
|
|
580
|
+
params[MetricExplorerUrlParam.Services] = JSON.stringify(scopedServiceIds);
|
|
581
|
+
}
|
|
582
|
+
|
|
570
583
|
const window: ResolvedTimeWindow = resolveTimeWindow(scope);
|
|
571
584
|
|
|
572
585
|
if (window.startTime && window.endTime) {
|
|
@@ -578,10 +591,6 @@ export function toMetricsExplorerQueryParams(
|
|
|
578
591
|
);
|
|
579
592
|
}
|
|
580
593
|
|
|
581
|
-
if (sanitizeValues(scope.serviceIds).length > 0) {
|
|
582
|
-
dropped.push("serviceIds");
|
|
583
|
-
}
|
|
584
|
-
|
|
585
594
|
for (const [facetKey] of sanitizeResourceFacetSelections(
|
|
586
595
|
scope.resourceFacetSelections,
|
|
587
596
|
)) {
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
|
|
11
|
+
import Route from "../../Types/API/Route";
|
|
12
|
+
import AnalyticsTableEngine from "../../Types/AnalyticsDatabase/AnalyticsTableEngine";
|
|
13
|
+
import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
|
|
14
|
+
import AnalyticsTableColumn, { SkipIndexType, } from "../../Types/AnalyticsDatabase/TableColumn";
|
|
15
|
+
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
16
|
+
import OperationalResource from "../../Types/Database/AccessControl/OperationalResource";
|
|
17
|
+
import OwnedThrough from "../../Types/Database/AccessControl/OwnedThrough";
|
|
18
|
+
import Permission from "../../Types/Permission";
|
|
19
|
+
import Service from "../DatabaseModels/Service";
|
|
20
|
+
/*
|
|
21
|
+
* Deploys, config changes, scaling events — the "what changed?" signal.
|
|
22
|
+
* Rows are posted by CI/CD pipelines through the change-events ingest API
|
|
23
|
+
* (or created from the product) and rendered as vertical dashed markers
|
|
24
|
+
* on metric charts, so "the spike started 40 seconds after deploy X" is
|
|
25
|
+
* visible without leaving the chart.
|
|
26
|
+
*
|
|
27
|
+
* Peer of LogItemV3 in layout: tenant projectId, per-row retentionDate
|
|
28
|
+
* TTL, Map(String,String) attributes with a bloom-indexed keys sidecar.
|
|
29
|
+
* Deliberately narrow — this is an annotation stream, not a log store.
|
|
30
|
+
*/
|
|
31
|
+
const readPermissions = [
|
|
32
|
+
Permission.ProjectOwner,
|
|
33
|
+
Permission.ProjectAdmin,
|
|
34
|
+
Permission.ProjectMember,
|
|
35
|
+
Permission.Viewer,
|
|
36
|
+
Permission.TelemetryAdmin,
|
|
37
|
+
Permission.TelemetryMember,
|
|
38
|
+
Permission.TelemetryViewer,
|
|
39
|
+
];
|
|
40
|
+
const createPermissions = [
|
|
41
|
+
Permission.ProjectOwner,
|
|
42
|
+
Permission.ProjectAdmin,
|
|
43
|
+
Permission.ProjectMember,
|
|
44
|
+
Permission.TelemetryAdmin,
|
|
45
|
+
Permission.TelemetryMember,
|
|
46
|
+
];
|
|
47
|
+
let ChangeEvent = class ChangeEvent extends AnalyticsBaseModel {
|
|
48
|
+
constructor() {
|
|
49
|
+
const projectIdColumn = new AnalyticsTableColumn({
|
|
50
|
+
key: "projectId",
|
|
51
|
+
title: "Project ID",
|
|
52
|
+
description: "ID of project",
|
|
53
|
+
required: true,
|
|
54
|
+
type: TableColumnType.ObjectID,
|
|
55
|
+
isTenantId: true,
|
|
56
|
+
accessControl: {
|
|
57
|
+
read: readPermissions,
|
|
58
|
+
create: createPermissions,
|
|
59
|
+
update: [],
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const primaryEntityIdColumn = new AnalyticsTableColumn({
|
|
63
|
+
key: "primaryEntityId",
|
|
64
|
+
title: "Service ID",
|
|
65
|
+
description: "ID of the telemetry Service this change belongs to (the deployed service). Optional — project-wide changes carry none.",
|
|
66
|
+
required: false,
|
|
67
|
+
type: TableColumnType.ObjectID,
|
|
68
|
+
accessControl: {
|
|
69
|
+
read: readPermissions,
|
|
70
|
+
create: createPermissions,
|
|
71
|
+
update: [],
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const primaryEntityTypeColumn = new AnalyticsTableColumn({
|
|
75
|
+
key: "primaryEntityType",
|
|
76
|
+
isLowCardinality: true,
|
|
77
|
+
title: "Service Type",
|
|
78
|
+
description: "Discriminator for primaryEntityId",
|
|
79
|
+
required: false,
|
|
80
|
+
type: TableColumnType.Text,
|
|
81
|
+
accessControl: {
|
|
82
|
+
read: readPermissions,
|
|
83
|
+
create: createPermissions,
|
|
84
|
+
update: [],
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const timeColumn = new AnalyticsTableColumn({
|
|
88
|
+
key: "time",
|
|
89
|
+
title: "Time",
|
|
90
|
+
description: "When the change happened",
|
|
91
|
+
required: true,
|
|
92
|
+
type: TableColumnType.DateTime64,
|
|
93
|
+
accessControl: {
|
|
94
|
+
read: readPermissions,
|
|
95
|
+
create: createPermissions,
|
|
96
|
+
update: [],
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
const eventTypeColumn = new AnalyticsTableColumn({
|
|
100
|
+
key: "eventType",
|
|
101
|
+
isLowCardinality: true,
|
|
102
|
+
title: "Event Type",
|
|
103
|
+
description: 'Kind of change — e.g. "deployment", "config-change", "scaling", "rollback", "custom"',
|
|
104
|
+
required: true,
|
|
105
|
+
defaultValue: "deployment",
|
|
106
|
+
type: TableColumnType.Text,
|
|
107
|
+
skipIndex: {
|
|
108
|
+
name: "idx_change_event_type",
|
|
109
|
+
type: SkipIndexType.Set,
|
|
110
|
+
params: [16],
|
|
111
|
+
granularity: 4,
|
|
112
|
+
},
|
|
113
|
+
accessControl: {
|
|
114
|
+
read: readPermissions,
|
|
115
|
+
create: createPermissions,
|
|
116
|
+
update: [],
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
const titleColumn = new AnalyticsTableColumn({
|
|
120
|
+
key: "title",
|
|
121
|
+
title: "Title",
|
|
122
|
+
description: 'Short human label, e.g. "Deploy v2.31.0"',
|
|
123
|
+
required: true,
|
|
124
|
+
type: TableColumnType.Text,
|
|
125
|
+
accessControl: {
|
|
126
|
+
read: readPermissions,
|
|
127
|
+
create: createPermissions,
|
|
128
|
+
update: [],
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const descriptionColumn = new AnalyticsTableColumn({
|
|
132
|
+
key: "description",
|
|
133
|
+
title: "Description",
|
|
134
|
+
description: "Optional detail — commit message, change summary, links",
|
|
135
|
+
required: false,
|
|
136
|
+
type: TableColumnType.Text,
|
|
137
|
+
accessControl: {
|
|
138
|
+
read: readPermissions,
|
|
139
|
+
create: createPermissions,
|
|
140
|
+
update: [],
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
const attributesColumn = new AnalyticsTableColumn({
|
|
144
|
+
key: "attributes",
|
|
145
|
+
codec: { codec: "ZSTD", level: 3 },
|
|
146
|
+
title: "Attributes",
|
|
147
|
+
description: "Arbitrary tags — version, commit sha, pipeline url, environment",
|
|
148
|
+
required: true,
|
|
149
|
+
defaultValue: {},
|
|
150
|
+
type: TableColumnType.MapStringString,
|
|
151
|
+
mapKeysColumn: "attributeKeys",
|
|
152
|
+
accessControl: {
|
|
153
|
+
read: readPermissions,
|
|
154
|
+
create: createPermissions,
|
|
155
|
+
update: [],
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
const attributeKeysColumn = new AnalyticsTableColumn({
|
|
159
|
+
key: "attributeKeys",
|
|
160
|
+
codec: { codec: "ZSTD", level: 3 },
|
|
161
|
+
title: "Attribute Keys",
|
|
162
|
+
description: "Attribute keys extracted from attributes",
|
|
163
|
+
required: true,
|
|
164
|
+
defaultValue: [],
|
|
165
|
+
type: TableColumnType.ArrayText,
|
|
166
|
+
skipIndex: {
|
|
167
|
+
name: "idx_attribute_keys",
|
|
168
|
+
type: SkipIndexType.BloomFilter,
|
|
169
|
+
params: [0.01],
|
|
170
|
+
granularity: 1,
|
|
171
|
+
},
|
|
172
|
+
accessControl: {
|
|
173
|
+
read: readPermissions,
|
|
174
|
+
create: createPermissions,
|
|
175
|
+
update: [],
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const retentionDateColumn = new AnalyticsTableColumn({
|
|
179
|
+
key: "retentionDate",
|
|
180
|
+
codec: [{ codec: "DoubleDelta" }, { codec: "ZSTD", level: 1 }],
|
|
181
|
+
title: "Retention Date",
|
|
182
|
+
description: "Date after which this row is eligible for TTL deletion, computed at ingest time",
|
|
183
|
+
required: true,
|
|
184
|
+
type: TableColumnType.Date,
|
|
185
|
+
defaultValue: undefined,
|
|
186
|
+
});
|
|
187
|
+
super({
|
|
188
|
+
tableName: AnalyticsTableName.ChangeEvent,
|
|
189
|
+
tableEngine: AnalyticsTableEngine.MergeTree,
|
|
190
|
+
singularName: "Change Event",
|
|
191
|
+
accessControl: {
|
|
192
|
+
read: readPermissions,
|
|
193
|
+
create: createPermissions,
|
|
194
|
+
update: [],
|
|
195
|
+
delete: [
|
|
196
|
+
Permission.ProjectOwner,
|
|
197
|
+
Permission.ProjectAdmin,
|
|
198
|
+
Permission.TelemetryAdmin,
|
|
199
|
+
],
|
|
200
|
+
},
|
|
201
|
+
pluralName: "Change Events",
|
|
202
|
+
crudApiPath: new Route("/change-events"),
|
|
203
|
+
enableMCP: true,
|
|
204
|
+
enableDocumentation: true,
|
|
205
|
+
tableDescription: "Change events (deployments, config changes, scaling) posted by CI/CD pipelines. Rendered as markers on metric charts so spikes can be correlated with what changed.",
|
|
206
|
+
tableColumns: [
|
|
207
|
+
projectIdColumn,
|
|
208
|
+
primaryEntityIdColumn,
|
|
209
|
+
primaryEntityTypeColumn,
|
|
210
|
+
timeColumn,
|
|
211
|
+
eventTypeColumn,
|
|
212
|
+
titleColumn,
|
|
213
|
+
descriptionColumn,
|
|
214
|
+
attributesColumn,
|
|
215
|
+
attributeKeysColumn,
|
|
216
|
+
retentionDateColumn,
|
|
217
|
+
],
|
|
218
|
+
sortKeys: ["projectId", "time"],
|
|
219
|
+
primaryKeys: ["projectId", "time"],
|
|
220
|
+
partitionKey: "toYYYYMMDD(time)",
|
|
221
|
+
/*
|
|
222
|
+
* Tiny volume (a handful of rows per deploy) — shard by the
|
|
223
|
+
* always-present tenant + time pair; no hotspot risk at this rate.
|
|
224
|
+
*/
|
|
225
|
+
shardingKey: "cityHash64(projectId, time)",
|
|
226
|
+
tableSettings: "ttl_only_drop_parts = 1, non_replicated_deduplication_window = 10000",
|
|
227
|
+
ttlExpression: "retentionDate DELETE",
|
|
228
|
+
defaultSortColumn: "time",
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
get projectId() {
|
|
232
|
+
return this.getColumnValue("projectId");
|
|
233
|
+
}
|
|
234
|
+
set projectId(v) {
|
|
235
|
+
this.setColumnValue("projectId", v);
|
|
236
|
+
}
|
|
237
|
+
get primaryEntityId() {
|
|
238
|
+
return this.getColumnValue("primaryEntityId");
|
|
239
|
+
}
|
|
240
|
+
set primaryEntityId(v) {
|
|
241
|
+
this.setColumnValue("primaryEntityId", v);
|
|
242
|
+
}
|
|
243
|
+
get primaryEntityType() {
|
|
244
|
+
return this.getColumnValue("primaryEntityType");
|
|
245
|
+
}
|
|
246
|
+
set primaryEntityType(v) {
|
|
247
|
+
this.setColumnValue("primaryEntityType", v);
|
|
248
|
+
}
|
|
249
|
+
get time() {
|
|
250
|
+
return this.getColumnValue("time");
|
|
251
|
+
}
|
|
252
|
+
set time(v) {
|
|
253
|
+
this.setColumnValue("time", v);
|
|
254
|
+
}
|
|
255
|
+
get eventType() {
|
|
256
|
+
return this.getColumnValue("eventType");
|
|
257
|
+
}
|
|
258
|
+
set eventType(v) {
|
|
259
|
+
this.setColumnValue("eventType", v);
|
|
260
|
+
}
|
|
261
|
+
get title() {
|
|
262
|
+
return this.getColumnValue("title");
|
|
263
|
+
}
|
|
264
|
+
set title(v) {
|
|
265
|
+
this.setColumnValue("title", v);
|
|
266
|
+
}
|
|
267
|
+
get description() {
|
|
268
|
+
return this.getColumnValue("description");
|
|
269
|
+
}
|
|
270
|
+
set description(v) {
|
|
271
|
+
this.setColumnValue("description", v);
|
|
272
|
+
}
|
|
273
|
+
get attributes() {
|
|
274
|
+
return this.getColumnValue("attributes");
|
|
275
|
+
}
|
|
276
|
+
set attributes(v) {
|
|
277
|
+
this.setColumnValue("attributes", v);
|
|
278
|
+
}
|
|
279
|
+
get attributeKeys() {
|
|
280
|
+
return this.getColumnValue("attributeKeys");
|
|
281
|
+
}
|
|
282
|
+
set attributeKeys(v) {
|
|
283
|
+
this.setColumnValue("attributeKeys", v);
|
|
284
|
+
}
|
|
285
|
+
get retentionDate() {
|
|
286
|
+
return this.getColumnValue("retentionDate");
|
|
287
|
+
}
|
|
288
|
+
set retentionDate(v) {
|
|
289
|
+
this.setColumnValue("retentionDate", v);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
ChangeEvent = __decorate([
|
|
293
|
+
OperationalResource(),
|
|
294
|
+
OwnedThrough("primaryEntityId", Service, { includeProjectScope: true }),
|
|
295
|
+
__metadata("design:paramtypes", [])
|
|
296
|
+
], ChangeEvent);
|
|
297
|
+
export default ChangeEvent;
|
|
298
|
+
//# sourceMappingURL=ChangeEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeEvent.js","sourceRoot":"","sources":["../../../../Models/AnalyticsModels/ChangeEvent.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ import ProfileSample from "./ProfileSample";
|
|
|
20
20
|
import RumSession from "./RumSession";
|
|
21
21
|
import RumSessionChunk from "./RumSessionChunk";
|
|
22
22
|
import AuditLog from "./AuditLog";
|
|
23
|
+
import ChangeEvent from "./ChangeEvent";
|
|
23
24
|
const AnalyticsModels = [
|
|
24
25
|
Log,
|
|
25
26
|
Span,
|
|
@@ -67,6 +68,7 @@ const AnalyticsModels = [
|
|
|
67
68
|
RumSessionChunk,
|
|
68
69
|
AuditLog,
|
|
69
70
|
SecurityEvent,
|
|
71
|
+
ChangeEvent,
|
|
70
72
|
];
|
|
71
73
|
const modelTypeMap = {};
|
|
72
74
|
export const getModelTypeByName = (tableName) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../../../../Models/AnalyticsModels/Index.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AACpE,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AACtE,OAAO,6BAA6B,MAAM,iCAAiC,CAAC;AAC5E,OAAO,4BAA4B,MAAM,gCAAgC,CAAC;AAC1E,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,QAAQ,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Index.js","sourceRoot":"","sources":["../../../../Models/AnalyticsModels/Index.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AACpE,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AACtE,OAAO,6BAA6B,MAAM,iCAAiC,CAAC;AAC5E,OAAO,4BAA4B,MAAM,gCAAgC,CAAC;AAC1E,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,MAAM,eAAe,GAA0C;IAC7D,GAAG;IACH,IAAI;IACJ,MAAM;IACN;;;OAGG;IACH,iBAAiB;IACjB;;;;OAIG;IACH,yBAAyB;IACzB;;;;OAIG;IACH,0BAA0B;IAC1B,6BAA6B;IAC7B,4BAA4B;IAC5B,oBAAoB;IACpB;;;OAGG;IACH,iBAAiB;IACjB,gBAAgB;IAChB,UAAU;IACV,iBAAiB;IACjB,UAAU;IACV,WAAW;IACX,wBAAwB;IACxB,OAAO;IACP,aAAa;IACb;;;;;OAKG;IACH,UAAU;IACV,eAAe;IACf,QAAQ;IACR,aAAa;IACb,WAAW;CACZ,CAAC;AAEF,MAAM,YAAY,GAAsD,EAAE,CAAC;AAM3E,MAAM,CAAC,MAAM,kBAAkB,GAAuB,CACpD,SAAiB,EACsB,EAAE;IACzC,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GACb,eAAe,CAAC,IAAI,CAAC,CAAC,SAAyC,EAAE,EAAE;QACjE,OAAO,IAAI,SAAS,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC;IACjD,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAEpC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -226,16 +226,10 @@ export const AnalyticsHost = process.env["ANALYTICS_HOST"] || "";
|
|
|
226
226
|
* Defaults to on, so the hosted product needs no deploy change.
|
|
227
227
|
*/
|
|
228
228
|
export const GoogleTagManagerEnabled = IsBillingEnabled && process.env["GOOGLE_TAG_MANAGER_ENABLED"] !== "false";
|
|
229
|
-
/*
|
|
230
|
-
* Shared secret Cal.com signs booking webhooks with (App/API/CalWebhook.ts).
|
|
231
|
-
* Server-only — must never be added to FRONTEND_ENV_ALLOW_LIST. Empty means
|
|
232
|
-
* the webhook endpoint is disabled and answers 503.
|
|
233
|
-
*/
|
|
234
|
-
export const CalWebhookSecret = process.env["CAL_WEBHOOK_SECRET"] || "";
|
|
235
229
|
/*
|
|
236
230
|
* Outbound marketing conversion webhooks.
|
|
237
231
|
*
|
|
238
|
-
* OneUptime does not store conversions. Signups
|
|
232
|
+
* OneUptime does not store conversions. Signups and plan
|
|
239
233
|
* upgrades/downgrades are POSTed to this endpoint as they happen and kept
|
|
240
234
|
* nowhere afterwards, so an unset URL means those moments are simply not
|
|
241
235
|
* measured — nothing accumulates waiting for one to be configured.
|