@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.
Files changed (86) hide show
  1. package/Models/AnalyticsModels/ChangeEvent.ts +331 -0
  2. package/Models/AnalyticsModels/Index.ts +2 -0
  3. package/Server/EnvironmentConfig.ts +1 -8
  4. package/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.ts +42 -0
  5. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +0 -2
  6. package/Server/Services/ChangeEventService.ts +11 -0
  7. package/Server/Services/EnterpriseLicenseService.ts +3 -3
  8. package/Server/Services/Index.ts +2 -0
  9. package/Server/Utils/Attribution.ts +11 -11
  10. package/Server/Utils/Marketing/MarketingEventWebhook.ts +4 -5
  11. package/Server/Utils/Telemetry/ChangeEventRow.ts +228 -0
  12. package/Server/Views/Partials/AnalyticsConsent.ejs +3 -95
  13. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +64 -0
  14. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +249 -0
  15. package/Tests/App/Dashboard/InvestigationArtifacts.test.tsx +315 -0
  16. package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +258 -0
  17. package/Tests/App/Dashboard/MetricChartsCompare.test.tsx +171 -0
  18. package/Tests/App/Dashboard/MetricViewCompare.test.tsx +233 -0
  19. package/Tests/Server/Infrastructure/Postgres/AddUserSlackAndMicrosoftTeamsMigration.test.ts +236 -0
  20. package/Tests/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.test.ts +224 -0
  21. package/Tests/Server/Utils/Attribution.test.ts +4 -5
  22. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +2 -2
  23. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +300 -0
  24. package/Tests/UI/Components/Charts/ChartGhostSeries.test.tsx +103 -0
  25. package/Tests/UI/Components/Charts/TooltipEntries.test.ts +44 -8
  26. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +13 -2
  27. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +7 -0
  28. package/Types/Marketing/Attribution.ts +9 -15
  29. package/Types/Marketing/MarketingEvent.ts +10 -46
  30. package/UI/Components/Charts/Area/AreaChart.tsx +15 -0
  31. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +16 -1
  32. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +189 -93
  33. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +6 -1
  34. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +213 -114
  35. package/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.ts +42 -27
  36. package/UI/Components/Charts/Line/LineChart.tsx +15 -0
  37. package/Utils/Metrics/MetricExplorerUrl.ts +119 -5
  38. package/Utils/Telemetry/CrossSignalScope.ts +19 -10
  39. package/build/dist/Models/AnalyticsModels/ChangeEvent.js +298 -0
  40. package/build/dist/Models/AnalyticsModels/ChangeEvent.js.map +1 -0
  41. package/build/dist/Models/AnalyticsModels/Index.js +2 -0
  42. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  43. package/build/dist/Server/EnvironmentConfig.js +1 -7
  44. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  45. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js +39 -0
  46. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js.map +1 -1
  47. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +0 -2
  48. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  49. package/build/dist/Server/Services/ChangeEventService.js +9 -0
  50. package/build/dist/Server/Services/ChangeEventService.js.map +1 -0
  51. package/build/dist/Server/Services/EnterpriseLicenseService.js +3 -3
  52. package/build/dist/Server/Services/Index.js +2 -0
  53. package/build/dist/Server/Services/Index.js.map +1 -1
  54. package/build/dist/Server/Utils/Attribution.js +6 -6
  55. package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js +4 -5
  56. package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js.map +1 -1
  57. package/build/dist/Server/Utils/Telemetry/ChangeEventRow.js +150 -0
  58. package/build/dist/Server/Utils/Telemetry/ChangeEventRow.js.map +1 -0
  59. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +7 -0
  60. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  61. package/build/dist/Types/Marketing/Attribution.js +9 -15
  62. package/build/dist/Types/Marketing/Attribution.js.map +1 -1
  63. package/build/dist/Types/Marketing/MarketingEvent.js +2 -33
  64. package/build/dist/Types/Marketing/MarketingEvent.js.map +1 -1
  65. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  66. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  67. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +9 -1
  68. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  69. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +92 -38
  70. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  71. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +8 -8
  72. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  73. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +95 -37
  74. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  75. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js +39 -24
  76. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js.map +1 -1
  77. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  78. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  79. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +81 -0
  80. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  81. package/build/dist/Utils/Telemetry/CrossSignalScope.js +14 -8
  82. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  83. package/package.json +1 -1
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.ts +0 -117
  85. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js +0 -106
  86. 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<string | number | boolean> | undefined;
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<string | number | boolean> =
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<string | number | boolean> =
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<string | number | boolean> {
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<string | number | boolean> = {};
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: serviceIds, resourceFacetSelections, traceIds, spanIds,
539
- * severityTexts, bodyContains — the metric explorer's URL grammar has no
540
- * service / resource / trace / span / severity / message dimension (metrics
541
- * carry a primaryEntityId column, but the explorer only parses metricName +
542
- * attributes out of `metricQueries`).
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;AAElC,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;CACd,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"}
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, booked meetings and plan
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.