Files

567 lines
16 KiB
TypeScript

import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
import Route from "../../Types/API/Route";
import AnalyticsTableEngine from "../../Types/AnalyticsDatabase/AnalyticsTableEngine";
import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
import AnalyticsTableColumn, {
SkipIndexType,
} from "../../Types/AnalyticsDatabase/TableColumn";
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
import { JSONObject } from "../../Types/JSON";
import ObjectID from "../../Types/ObjectID";
import Permission from "../../Types/Permission";
import LogSeverity from "../../Types/Log/LogSeverity";
export default class Log extends AnalyticsBaseModel {
public constructor() {
const projectIdColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "projectId",
title: "Project ID",
description: "ID of project",
required: true,
type: TableColumnType.ObjectID,
isTenantId: true,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const serviceIdColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "serviceId",
title: "Service ID",
description: "ID of the Service which created the log",
required: true,
type: TableColumnType.ObjectID,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const timeColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "time",
title: "Time",
description: "When was the log created?",
required: true,
type: TableColumnType.DateTime64,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const timeUnixNanoColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "timeUnixNano",
title: "Time (in Unix Nano)",
description: "When was the log created?",
required: true,
type: TableColumnType.LongNumber,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const severityTextColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "severityText",
title: "Severity Text",
description: "Log Severity Text",
required: true,
type: TableColumnType.Text,
skipIndex: {
name: "idx_severity",
type: SkipIndexType.Set,
params: [10],
granularity: 4,
},
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const severityNumberColumn: AnalyticsTableColumn = new AnalyticsTableColumn(
{
key: "severityNumber",
title: "Severity Number",
description: "Log Severity Number",
required: true,
type: TableColumnType.Number,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
},
);
const attributesColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "attributes",
title: "Attributes",
description: "Attributes",
required: true,
defaultValue: {},
type: TableColumnType.MapStringString,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const attributeKeysColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "attributeKeys",
title: "Attribute Keys",
description: "Attribute keys extracted from attributes",
required: true,
defaultValue: [],
type: TableColumnType.ArrayText,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const traceIdColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "traceId",
title: "Trace ID",
description: "ID of the trace",
required: false,
type: TableColumnType.Text,
skipIndex: {
name: "idx_trace_id",
type: SkipIndexType.BloomFilter,
params: [0.01],
granularity: 1,
},
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const spanIdColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "spanId",
title: "Span ID",
description: "ID of the span",
required: false,
type: TableColumnType.Text,
skipIndex: {
name: "idx_span_id",
type: SkipIndexType.BloomFilter,
params: [0.01],
granularity: 1,
},
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const bodyColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "body",
title: "Log Body",
description: "Body of the Log",
required: false,
type: TableColumnType.Text,
skipIndex: {
name: "idx_body",
type: SkipIndexType.TokenBF,
params: [10240, 3, 0],
granularity: 4,
},
codec: {
codec: "ZSTD",
level: 3,
},
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const observedTimeUnixNanoColumn: AnalyticsTableColumn =
new AnalyticsTableColumn({
key: "observedTimeUnixNano",
title: "Observed Time (in Unix Nano)",
description:
"When the log was observed/collected by the telemetry pipeline",
required: false,
type: TableColumnType.LongNumber,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const droppedAttributesCountColumn: AnalyticsTableColumn =
new AnalyticsTableColumn({
key: "droppedAttributesCount",
title: "Dropped Attributes Count",
description: "Number of attributes that were dropped during collection",
required: false,
type: TableColumnType.Number,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const flagsColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "flags",
title: "Flags",
description: "Log record flags (e.g., W3C trace flags)",
required: false,
type: TableColumnType.Number,
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [],
},
});
const retentionDateColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
key: "retentionDate",
title: "Retention Date",
description:
"Date after which this row is eligible for TTL deletion, computed at ingest time as time + service.retainTelemetryDataForDays",
required: true,
type: TableColumnType.Date,
defaultValue: undefined,
});
super({
tableName: AnalyticsTableName.Log,
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: "Log",
accessControl: {
read: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.ReadTelemetryServiceLog,
],
create: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.CreateTelemetryServiceLog,
],
update: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.EditTelemetryServiceLog,
],
delete: [
Permission.ProjectOwner,
Permission.ProjectAdmin,
Permission.ProjectMember,
Permission.DeleteTelemetryServiceLog,
],
},
pluralName: "Logs",
crudApiPath: new Route("/logs"),
tableColumns: [
projectIdColumn,
serviceIdColumn,
timeColumn,
timeUnixNanoColumn,
severityTextColumn,
severityNumberColumn,
attributesColumn,
attributeKeysColumn,
traceIdColumn,
spanIdColumn,
bodyColumn,
observedTimeUnixNanoColumn,
droppedAttributesCountColumn,
flagsColumn,
retentionDateColumn,
],
projections: [
{
name: "proj_severity_histogram",
query:
"SELECT projectId, severityText, toStartOfInterval(time, INTERVAL 1 MINUTE) AS minute, count() AS cnt GROUP BY projectId, severityText, minute",
},
],
sortKeys: ["projectId", "time", "serviceId"],
primaryKeys: ["projectId", "time", "serviceId"],
partitionKey: "sipHash64(projectId) % 16",
ttlExpression: "retentionDate DELETE",
});
}
public get projectId(): ObjectID | undefined {
return this.getColumnValue("projectId") as ObjectID | undefined;
}
public set projectId(v: ObjectID | undefined) {
this.setColumnValue("projectId", v);
}
public get serviceId(): ObjectID | undefined {
return this.getColumnValue("serviceId") as ObjectID | undefined;
}
public set serviceId(v: ObjectID | undefined) {
this.setColumnValue("serviceId", v);
}
public set body(v: string | undefined) {
this.setColumnValue("body", v);
}
public get body(): string | undefined {
return this.getColumnValue("body");
}
public get time(): Date | undefined {
return this.getColumnValue("time") as Date | undefined;
}
public set time(v: Date | undefined) {
this.setColumnValue("time", v);
}
public get timeUnixNano(): number | undefined {
return this.getColumnValue("timeUnixNano") as number | undefined;
}
public set timeUnixNano(v: number | undefined) {
this.setColumnValue("timeUnixNano", v);
}
public get severityText(): LogSeverity | undefined {
return this.getColumnValue("severityText") as LogSeverity | undefined;
}
public set severityText(v: LogSeverity | undefined) {
this.setColumnValue("severityText", v);
}
public get severityNumber(): number | undefined {
return this.getColumnValue("severityNumber") as number | undefined;
}
public set severityNumber(v: number | undefined) {
this.setColumnValue("severityNumber", v);
}
public get attributes(): JSONObject | undefined {
return this.getColumnValue("attributes") as JSONObject | undefined;
}
public set attributes(v: JSONObject | undefined) {
this.setColumnValue("attributes", v);
}
public get attributeKeys(): Array<string> | undefined {
return this.getColumnValue("attributeKeys") as Array<string> | undefined;
}
public set attributeKeys(v: Array<string> | undefined) {
this.setColumnValue("attributeKeys", v);
}
public get traceId(): string | undefined {
return this.getColumnValue("traceId") as string | undefined;
}
public set traceId(v: string | undefined) {
this.setColumnValue("traceId", v);
}
public get spanId(): string | undefined {
return this.getColumnValue("spanId") as string | undefined;
}
public set spanId(v: string | undefined) {
this.setColumnValue("spanId", v);
}
public get observedTimeUnixNano(): number | undefined {
return this.getColumnValue("observedTimeUnixNano") as number | undefined;
}
public set observedTimeUnixNano(v: number | undefined) {
this.setColumnValue("observedTimeUnixNano", v);
}
public get droppedAttributesCount(): number | undefined {
return this.getColumnValue("droppedAttributesCount") as number | undefined;
}
public set droppedAttributesCount(v: number | undefined) {
this.setColumnValue("droppedAttributesCount", v);
}
public get flags(): number | undefined {
return this.getColumnValue("flags") as number | undefined;
}
public set flags(v: number | undefined) {
this.setColumnValue("flags", v);
}
public get retentionDate(): Date | undefined {
return this.getColumnValue("retentionDate") as Date | undefined;
}
public set retentionDate(v: Date | undefined) {
this.setColumnValue("retentionDate", v);
}
}