@marinoscar/platform-api 0.0.0-stage → 0.1.0-next.3
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/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +106 -2
- package/dist/core/crypto/encryption-key-startup-check.d.ts +29 -0
- package/dist/core/crypto/encryption-key-startup-check.d.ts.map +1 -0
- package/dist/core/crypto/encryption-key-startup-check.js +221 -0
- package/dist/core/crypto/encryption-key-startup-check.js.map +1 -0
- package/dist/core/crypto/secret-cipher.d.ts +151 -0
- package/dist/core/crypto/secret-cipher.d.ts.map +1 -0
- package/dist/core/crypto/secret-cipher.js +452 -0
- package/dist/core/crypto/secret-cipher.js.map +1 -0
- package/dist/core/data-access/index.d.ts +6 -0
- package/dist/core/data-access/index.d.ts.map +1 -0
- package/dist/core/data-access/index.js +19 -0
- package/dist/core/data-access/index.js.map +1 -0
- package/dist/core/data-access/scoped-access.error.d.ts +35 -0
- package/dist/core/data-access/scoped-access.error.d.ts.map +1 -0
- package/dist/core/data-access/scoped-access.error.js +43 -0
- package/dist/core/data-access/scoped-access.error.js.map +1 -0
- package/dist/core/data-access/scoped-client.d.ts +104 -0
- package/dist/core/data-access/scoped-client.d.ts.map +1 -0
- package/dist/core/data-access/scoped-client.js +270 -0
- package/dist/core/data-access/scoped-client.js.map +1 -0
- package/dist/core/data-access/types.d.ts +85 -0
- package/dist/core/data-access/types.d.ts.map +1 -0
- package/dist/core/data-access/types.js +12 -0
- package/dist/core/data-access/types.js.map +1 -0
- package/dist/core/data-access/user-owned-data.registry.d.ts +60 -0
- package/dist/core/data-access/user-owned-data.registry.d.ts.map +1 -0
- package/dist/core/data-access/user-owned-data.registry.js +140 -0
- package/dist/core/data-access/user-owned-data.registry.js.map +1 -0
- package/dist/core/errors/database-seed.exception.d.ts +23 -0
- package/dist/core/errors/database-seed.exception.d.ts.map +1 -0
- package/dist/core/errors/database-seed.exception.js +49 -0
- package/dist/core/errors/database-seed.exception.js.map +1 -0
- package/dist/core/errors/error.dto.d.ts +47 -0
- package/dist/core/errors/error.dto.d.ts.map +1 -0
- package/dist/core/errors/error.dto.js +121 -0
- package/dist/core/errors/error.dto.js.map +1 -0
- package/dist/core/errors/http-exception.filter.d.ts +63 -0
- package/dist/core/errors/http-exception.filter.d.ts.map +1 -0
- package/dist/core/errors/http-exception.filter.js +234 -0
- package/dist/core/errors/http-exception.filter.js.map +1 -0
- package/dist/core/errors/verbatim-error-body.exception.d.ts +46 -0
- package/dist/core/errors/verbatim-error-body.exception.d.ts.map +1 -0
- package/dist/core/errors/verbatim-error-body.exception.js +135 -0
- package/dist/core/errors/verbatim-error-body.exception.js.map +1 -0
- package/dist/core/host/index.d.ts +7 -0
- package/dist/core/host/index.d.ts.map +1 -0
- package/dist/core/host/index.js +14 -0
- package/dist/core/host/index.js.map +1 -0
- package/dist/core/host/platform-host.d.ts +58 -0
- package/dist/core/host/platform-host.d.ts.map +1 -0
- package/dist/core/host/platform-host.js +104 -0
- package/dist/core/host/platform-host.js.map +1 -0
- package/dist/core/host/platform-host.module.d.ts +53 -0
- package/dist/core/host/platform-host.module.d.ts.map +1 -0
- package/dist/core/host/platform-host.module.js +90 -0
- package/dist/core/host/platform-host.module.js.map +1 -0
- package/dist/core/host/ports.d.ts +132 -0
- package/dist/core/host/ports.d.ts.map +1 -0
- package/dist/core/host/ports.js +48 -0
- package/dist/core/host/ports.js.map +1 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +77 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/openapi/openapi-tag.registry.d.ts +80 -0
- package/dist/core/openapi/openapi-tag.registry.d.ts.map +1 -0
- package/dist/core/openapi/openapi-tag.registry.js +72 -0
- package/dist/core/openapi/openapi-tag.registry.js.map +1 -0
- package/dist/core/principal/index.d.ts +6 -0
- package/dist/core/principal/index.d.ts.map +1 -0
- package/dist/core/principal/index.js +3 -0
- package/dist/core/principal/index.js.map +1 -0
- package/dist/core/principal/principal.types.d.ts +222 -0
- package/dist/core/principal/principal.types.d.ts.map +1 -0
- package/dist/core/principal/principal.types.js +22 -0
- package/dist/core/principal/principal.types.js.map +1 -0
- package/dist/core/registry/index.d.ts +4 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +19 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/registry-freeze.service.d.ts +14 -0
- package/dist/core/registry/registry-freeze.service.d.ts.map +1 -0
- package/dist/core/registry/registry-freeze.service.js +55 -0
- package/dist/core/registry/registry-freeze.service.js.map +1 -0
- package/dist/core/registry/registry.d.ts +268 -0
- package/dist/core/registry/registry.d.ts.map +1 -0
- package/dist/core/registry/registry.js +351 -0
- package/dist/core/registry/registry.js.map +1 -0
- package/dist/core/registry/testing.d.ts +29 -0
- package/dist/core/registry/testing.d.ts.map +1 -0
- package/dist/core/registry/testing.js +63 -0
- package/dist/core/registry/testing.js.map +1 -0
- package/dist/doctor/doctor-check.interface.d.ts +100 -0
- package/dist/doctor/doctor-check.interface.d.ts.map +1 -0
- package/dist/doctor/doctor-check.interface.js +95 -0
- package/dist/doctor/doctor-check.interface.js.map +1 -0
- package/dist/doctor/doctor-check.registry.d.ts +37 -0
- package/dist/doctor/doctor-check.registry.d.ts.map +1 -0
- package/dist/doctor/doctor-check.registry.js +96 -0
- package/dist/doctor/doctor-check.registry.js.map +1 -0
- package/dist/doctor/doctor.controller.factory.d.ts +29 -0
- package/dist/doctor/doctor.controller.factory.d.ts.map +1 -0
- package/dist/doctor/doctor.controller.factory.js +121 -0
- package/dist/doctor/doctor.controller.factory.js.map +1 -0
- package/dist/doctor/doctor.module.d.ts +78 -0
- package/dist/doctor/doctor.module.d.ts.map +1 -0
- package/dist/doctor/doctor.module.js +158 -0
- package/dist/doctor/doctor.module.js.map +1 -0
- package/dist/doctor/doctor.options.d.ts +39 -0
- package/dist/doctor/doctor.options.d.ts.map +1 -0
- package/dist/doctor/doctor.options.js +21 -0
- package/dist/doctor/doctor.options.js.map +1 -0
- package/dist/doctor/doctor.service.d.ts +80 -0
- package/dist/doctor/doctor.service.d.ts.map +1 -0
- package/dist/doctor/doctor.service.js +301 -0
- package/dist/doctor/doctor.service.js.map +1 -0
- package/dist/doctor/dto/doctor-query.dto.d.ts +15 -0
- package/dist/doctor/dto/doctor-query.dto.d.ts.map +1 -0
- package/dist/doctor/dto/doctor-query.dto.js +16 -0
- package/dist/doctor/dto/doctor-query.dto.js.map +1 -0
- package/dist/doctor/dto/doctor-report.dto.d.ts +27 -0
- package/dist/doctor/dto/doctor-report.dto.d.ts.map +1 -0
- package/dist/doctor/dto/doctor-report.dto.js +23 -0
- package/dist/doctor/dto/doctor-report.dto.js.map +1 -0
- package/dist/doctor/egress/classify-host.d.ts +73 -0
- package/dist/doctor/egress/classify-host.d.ts.map +1 -0
- package/dist/doctor/egress/classify-host.js +210 -0
- package/dist/doctor/egress/classify-host.js.map +1 -0
- package/dist/doctor/egress/egress.registry.d.ts +34 -0
- package/dist/doctor/egress/egress.registry.d.ts.map +1 -0
- package/dist/doctor/egress/egress.registry.js +70 -0
- package/dist/doctor/egress/egress.registry.js.map +1 -0
- package/dist/doctor/egress/egress.types.d.ts +135 -0
- package/dist/doctor/egress/egress.types.d.ts.map +1 -0
- package/dist/doctor/egress/egress.types.js +42 -0
- package/dist/doctor/egress/egress.types.js.map +1 -0
- package/dist/doctor/egress/index.d.ts +6 -0
- package/dist/doctor/egress/index.d.ts.map +1 -0
- package/dist/doctor/egress/index.js +23 -0
- package/dist/doctor/egress/index.js.map +1 -0
- package/dist/doctor/egress/network-egress.doctor-check.d.ts +78 -0
- package/dist/doctor/egress/network-egress.doctor-check.d.ts.map +1 -0
- package/dist/doctor/egress/network-egress.doctor-check.js +226 -0
- package/dist/doctor/egress/network-egress.doctor-check.js.map +1 -0
- package/dist/doctor/index.d.ts +19 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +66 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/support-bundle/index.d.ts +12 -0
- package/dist/doctor/support-bundle/index.d.ts.map +1 -0
- package/dist/doctor/support-bundle/index.js +32 -0
- package/dist/doctor/support-bundle/index.js.map +1 -0
- package/dist/doctor/support-bundle/redact.d.ts +76 -0
- package/dist/doctor/support-bundle/redact.d.ts.map +1 -0
- package/dist/doctor/support-bundle/redact.js +236 -0
- package/dist/doctor/support-bundle/redact.js.map +1 -0
- package/dist/doctor/support-bundle/sections/doctor.section.d.ts +81 -0
- package/dist/doctor/support-bundle/sections/doctor.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/doctor.section.js +83 -0
- package/dist/doctor/support-bundle/sections/doctor.section.js.map +1 -0
- package/dist/doctor/support-bundle/sections/egress.section.d.ts +73 -0
- package/dist/doctor/support-bundle/sections/egress.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/egress.section.js +97 -0
- package/dist/doctor/support-bundle/sections/egress.section.js.map +1 -0
- package/dist/doctor/support-bundle/sections/meta.section.d.ts +39 -0
- package/dist/doctor/support-bundle/sections/meta.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/meta.section.js +89 -0
- package/dist/doctor/support-bundle/sections/meta.section.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.d.ts +100 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.js +59 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.controller.d.ts +57 -0
- package/dist/doctor/support-bundle/support-bundle.controller.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.controller.js +141 -0
- package/dist/doctor/support-bundle/support-bundle.controller.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.options.d.ts +92 -0
- package/dist/doctor/support-bundle/support-bundle.options.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.options.js +100 -0
- package/dist/doctor/support-bundle/support-bundle.options.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.registry.d.ts +38 -0
- package/dist/doctor/support-bundle/support-bundle.registry.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.registry.js +90 -0
- package/dist/doctor/support-bundle/support-bundle.registry.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.service.d.ts +63 -0
- package/dist/doctor/support-bundle/support-bundle.service.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.service.js +244 -0
- package/dist/doctor/support-bundle/support-bundle.service.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/otel-core/index.d.ts +9 -0
- package/dist/otel-core/index.d.ts.map +1 -0
- package/dist/otel-core/index.js +58 -0
- package/dist/otel-core/index.js.map +1 -0
- package/dist/otel-core/metrics/gauge-provider.d.ts +44 -0
- package/dist/otel-core/metrics/gauge-provider.d.ts.map +1 -0
- package/dist/otel-core/metrics/gauge-provider.js +37 -0
- package/dist/otel-core/metrics/gauge-provider.js.map +1 -0
- package/dist/otel-core/metrics/labels.d.ts +79 -0
- package/dist/otel-core/metrics/labels.d.ts.map +1 -0
- package/dist/otel-core/metrics/labels.js +135 -0
- package/dist/otel-core/metrics/labels.js.map +1 -0
- package/dist/otel-core/metrics/metric-name.registry.d.ts +130 -0
- package/dist/otel-core/metrics/metric-name.registry.d.ts.map +1 -0
- package/dist/otel-core/metrics/metric-name.registry.js +134 -0
- package/dist/otel-core/metrics/metric-name.registry.js.map +1 -0
- package/dist/otel-core/metrics/metrics-host.service.d.ts +163 -0
- package/dist/otel-core/metrics/metrics-host.service.d.ts.map +1 -0
- package/dist/otel-core/metrics/metrics-host.service.js +344 -0
- package/dist/otel-core/metrics/metrics-host.service.js.map +1 -0
- package/dist/otel-core/metrics/otel-metrics.module.d.ts +54 -0
- package/dist/otel-core/metrics/otel-metrics.module.d.ts.map +1 -0
- package/dist/otel-core/metrics/otel-metrics.module.js +83 -0
- package/dist/otel-core/metrics/otel-metrics.module.js.map +1 -0
- package/dist/otel-core/sdk/index.d.ts +5 -0
- package/dist/otel-core/sdk/index.d.ts.map +1 -0
- package/dist/otel-core/sdk/index.js +27 -0
- package/dist/otel-core/sdk/index.js.map +1 -0
- package/dist/otel-core/sdk/initialize-otel.d.ts +126 -0
- package/dist/otel-core/sdk/initialize-otel.d.ts.map +1 -0
- package/dist/otel-core/sdk/initialize-otel.js +204 -0
- package/dist/otel-core/sdk/initialize-otel.js.map +1 -0
- package/dist/otel-core/sdk/instance-id.d.ts +29 -0
- package/dist/otel-core/sdk/instance-id.d.ts.map +1 -0
- package/dist/otel-core/sdk/instance-id.js +65 -0
- package/dist/otel-core/sdk/instance-id.js.map +1 -0
- package/dist/otel-core/sdk/service-name.d.ts +28 -0
- package/dist/otel-core/sdk/service-name.d.ts.map +1 -0
- package/dist/otel-core/sdk/service-name.js +63 -0
- package/dist/otel-core/sdk/service-name.js.map +1 -0
- package/dist/otel-core/sdk/telemetry-gate.d.ts +116 -0
- package/dist/otel-core/sdk/telemetry-gate.d.ts.map +1 -0
- package/dist/otel-core/sdk/telemetry-gate.js +297 -0
- package/dist/otel-core/sdk/telemetry-gate.js.map +1 -0
- package/dist/otel-core/spans/request-span-attributes.d.ts +58 -0
- package/dist/otel-core/spans/request-span-attributes.d.ts.map +1 -0
- package/dist/otel-core/spans/request-span-attributes.js +155 -0
- package/dist/otel-core/spans/request-span-attributes.js.map +1 -0
- package/dist/otel-core/spans/trace.decorator.d.ts +36 -0
- package/dist/otel-core/spans/trace.decorator.d.ts.map +1 -0
- package/dist/otel-core/spans/trace.decorator.js +74 -0
- package/dist/otel-core/spans/trace.decorator.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.d.ts +15 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.js +50 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.d.ts +14 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.js +178 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.d.ts +147 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.js +495 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.d.ts +216 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.js +1256 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.d.ts +69 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.js +471 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.d.ts +15 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.js +68 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.js.map +1 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.d.ts +92 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.d.ts.map +1 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.js +41 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.d.ts +45 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.js +303 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.d.ts +41 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.js +187 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.controller.d.ts +14 -0
- package/dist/telemetry/connection/telemetry-connection.controller.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.controller.js +192 -0
- package/dist/telemetry/connection/telemetry-connection.controller.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.schema.d.ts +28 -0
- package/dist/telemetry/connection/telemetry-connection.schema.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.schema.js +106 -0
- package/dist/telemetry/connection/telemetry-connection.schema.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.service.d.ts +197 -0
- package/dist/telemetry/connection/telemetry-connection.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.service.js +461 -0
- package/dist/telemetry/connection/telemetry-connection.service.js.map +1 -0
- package/dist/telemetry/dashboard/sql-literals.d.ts +19 -0
- package/dist/telemetry/dashboard/sql-literals.d.ts.map +1 -0
- package/dist/telemetry/dashboard/sql-literals.js +75 -0
- package/dist/telemetry/dashboard/sql-literals.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.d.ts +14 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.js +277 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts +112 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js +904 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.d.ts +212 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.js +486 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts +235 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js +269 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js.map +1 -0
- package/dist/telemetry/dashboard/verdict-policy.d.ts +51 -0
- package/dist/telemetry/dashboard/verdict-policy.d.ts.map +1 -0
- package/dist/telemetry/dashboard/verdict-policy.js +77 -0
- package/dist/telemetry/dashboard/verdict-policy.js.map +1 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.d.ts +21 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.d.ts.map +1 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.js +59 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.js +69 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.d.ts +33 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.js +105 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.d.ts +38 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.js +104 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.js +65 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.js +91 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.js.map +1 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.d.ts +14 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.js +29 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-config.dto.d.ts +59 -0
- package/dist/telemetry/dto/telemetry-config.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-config.dto.js +18 -0
- package/dist/telemetry/dto/telemetry-config.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts +397 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.js +118 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-query.dto.d.ts +44 -0
- package/dist/telemetry/dto/telemetry-query.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-query.dto.js +42 -0
- package/dist/telemetry/dto/telemetry-query.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-status.dto.d.ts +22 -0
- package/dist/telemetry/dto/telemetry-status.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-status.dto.js +12 -0
- package/dist/telemetry/dto/telemetry-status.dto.js.map +1 -0
- package/dist/telemetry/export/parquet-writer.loader.d.ts +13 -0
- package/dist/telemetry/export/parquet-writer.loader.d.ts.map +1 -0
- package/dist/telemetry/export/parquet-writer.loader.js +29 -0
- package/dist/telemetry/export/parquet-writer.loader.js.map +1 -0
- package/dist/telemetry/export/telemetry-export.service.d.ts +39 -0
- package/dist/telemetry/export/telemetry-export.service.d.ts.map +1 -0
- package/dist/telemetry/export/telemetry-export.service.js +185 -0
- package/dist/telemetry/export/telemetry-export.service.js.map +1 -0
- package/dist/telemetry/greptime/greptime-host.d.ts +44 -0
- package/dist/telemetry/greptime/greptime-host.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime-host.js +114 -0
- package/dist/telemetry/greptime/greptime-host.js.map +1 -0
- package/dist/telemetry/greptime/greptime.client.d.ts +171 -0
- package/dist/telemetry/greptime/greptime.client.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime.client.js +352 -0
- package/dist/telemetry/greptime/greptime.client.js.map +1 -0
- package/dist/telemetry/greptime/greptime.errors.d.ts +59 -0
- package/dist/telemetry/greptime/greptime.errors.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime.errors.js +100 -0
- package/dist/telemetry/greptime/greptime.errors.js.map +1 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.d.ts +27 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.d.ts.map +1 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.js +123 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.js.map +1 -0
- package/dist/telemetry/index.d.ts +37 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +97 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/internal/blank-secret.d.ts +3 -0
- package/dist/telemetry/internal/blank-secret.d.ts.map +1 -0
- package/dist/telemetry/internal/blank-secret.js +14 -0
- package/dist/telemetry/internal/blank-secret.js.map +1 -0
- package/dist/telemetry/internal/csv.d.ts +9 -0
- package/dist/telemetry/internal/csv.d.ts.map +1 -0
- package/dist/telemetry/internal/csv.js +23 -0
- package/dist/telemetry/internal/csv.js.map +1 -0
- package/dist/telemetry/internal/sse.d.ts +23 -0
- package/dist/telemetry/internal/sse.d.ts.map +1 -0
- package/dist/telemetry/internal/sse.js +43 -0
- package/dist/telemetry/internal/sse.js.map +1 -0
- package/dist/telemetry/metrics/groups/database.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/database.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/database.metric-group.js +159 -0
- package/dist/telemetry/metrics/groups/database.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/host.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/host.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/host.metric-group.js +146 -0
- package/dist/telemetry/metrics/groups/host.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js +159 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.js +144 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.js +163 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.js +103 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.d.ts +324 -0
- package/dist/telemetry/metrics/metric-catalog.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.d.ts +30 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.js +37 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.js.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.js +180 -0
- package/dist/telemetry/metrics/metric-catalog.js.map +1 -0
- package/dist/telemetry/metrics/metric-group-registry.service.d.ts +59 -0
- package/dist/telemetry/metrics/metric-group-registry.service.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group-registry.service.js +99 -0
- package/dist/telemetry/metrics/metric-group-registry.service.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.d.ts +113 -0
- package/dist/telemetry/metrics/metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.js +647 -0
- package/dist/telemetry/metrics/metric-group.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.manifest.d.ts +2 -0
- package/dist/telemetry/metrics/metric-group.manifest.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.manifest.js +30 -0
- package/dist/telemetry/metrics/metric-group.manifest.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.registry.d.ts +109 -0
- package/dist/telemetry/metrics/metric-group.registry.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.registry.js +181 -0
- package/dist/telemetry/metrics/metric-group.registry.js.map +1 -0
- package/dist/telemetry/metrics/metric-sql.d.ts +98 -0
- package/dist/telemetry/metrics/metric-sql.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-sql.js +259 -0
- package/dist/telemetry/metrics/metric-sql.js.map +1 -0
- package/dist/telemetry/metrics/metric-values.d.ts +19 -0
- package/dist/telemetry/metrics/metric-values.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-values.js +97 -0
- package/dist/telemetry/metrics/metric-values.js.map +1 -0
- package/dist/telemetry/metrics/metric-verdict.d.ts +20 -0
- package/dist/telemetry/metrics/metric-verdict.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-verdict.js +218 -0
- package/dist/telemetry/metrics/metric-verdict.js.map +1 -0
- package/dist/telemetry/ports.d.ts +575 -0
- package/dist/telemetry/ports.d.ts.map +1 -0
- package/dist/telemetry/ports.js +78 -0
- package/dist/telemetry/ports.js.map +1 -0
- package/dist/telemetry/query/sql-guard.d.ts +71 -0
- package/dist/telemetry/query/sql-guard.d.ts.map +1 -0
- package/dist/telemetry/query/sql-guard.js +258 -0
- package/dist/telemetry/query/sql-guard.js.map +1 -0
- package/dist/telemetry/query/telemetry-availability.d.ts +11 -0
- package/dist/telemetry/query/telemetry-availability.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-availability.js +55 -0
- package/dist/telemetry/query/telemetry-availability.js.map +1 -0
- package/dist/telemetry/query/telemetry-query.errors.d.ts +48 -0
- package/dist/telemetry/query/telemetry-query.errors.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-query.errors.js +100 -0
- package/dist/telemetry/query/telemetry-query.errors.js.map +1 -0
- package/dist/telemetry/query/telemetry-query.service.d.ts +57 -0
- package/dist/telemetry/query/telemetry-query.service.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-query.service.js +194 -0
- package/dist/telemetry/query/telemetry-query.service.js.map +1 -0
- package/dist/telemetry/query/telemetry-schema.service.d.ts +36 -0
- package/dist/telemetry/query/telemetry-schema.service.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-schema.service.js +154 -0
- package/dist/telemetry/query/telemetry-schema.service.js.map +1 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +29 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts.map +1 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.js +27 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.js.map +1 -0
- package/dist/telemetry/stack/stack-agent.client.d.ts +76 -0
- package/dist/telemetry/stack/stack-agent.client.d.ts.map +1 -0
- package/dist/telemetry/stack/stack-agent.client.js +208 -0
- package/dist/telemetry/stack/stack-agent.client.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.d.ts +43 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.js +159 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.controller.d.ts +14 -0
- package/dist/telemetry/stack/telemetry-stack.controller.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.controller.js +107 -0
- package/dist/telemetry/stack/telemetry-stack.controller.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.service.d.ts +19 -0
- package/dist/telemetry/stack/telemetry-stack.service.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.service.js +122 -0
- package/dist/telemetry/stack/telemetry-stack.service.js.map +1 -0
- package/dist/telemetry/tasks/telemetry-retention.task.d.ts +8 -0
- package/dist/telemetry/tasks/telemetry-retention.task.d.ts.map +1 -0
- package/dist/telemetry/tasks/telemetry-retention.task.js +61 -0
- package/dist/telemetry/tasks/telemetry-retention.task.js.map +1 -0
- package/dist/telemetry/telemetry-admin.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-admin.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-admin.controller.js +148 -0
- package/dist/telemetry/telemetry-admin.controller.js.map +1 -0
- package/dist/telemetry/telemetry-config.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-config.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-config.controller.js +73 -0
- package/dist/telemetry/telemetry-config.controller.js.map +1 -0
- package/dist/telemetry/telemetry-explorer.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-explorer.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-explorer.controller.js +193 -0
- package/dist/telemetry/telemetry-explorer.controller.js.map +1 -0
- package/dist/telemetry/telemetry-settings.service.d.ts +85 -0
- package/dist/telemetry/telemetry-settings.service.d.ts.map +1 -0
- package/dist/telemetry/telemetry-settings.service.js +278 -0
- package/dist/telemetry/telemetry-settings.service.js.map +1 -0
- package/dist/telemetry/telemetry-status.service.d.ts +28 -0
- package/dist/telemetry/telemetry-status.service.d.ts.map +1 -0
- package/dist/telemetry/telemetry-status.service.js +185 -0
- package/dist/telemetry/telemetry-status.service.js.map +1 -0
- package/dist/telemetry/telemetry-support-bundle.section.d.ts +163 -0
- package/dist/telemetry/telemetry-support-bundle.section.d.ts.map +1 -0
- package/dist/telemetry/telemetry-support-bundle.section.js +187 -0
- package/dist/telemetry/telemetry-support-bundle.section.js.map +1 -0
- package/dist/telemetry/telemetry.module.d.ts +35 -0
- package/dist/telemetry/telemetry.module.d.ts.map +1 -0
- package/dist/telemetry/telemetry.module.js +210 -0
- package/dist/telemetry/telemetry.module.js.map +1 -0
- package/dist/telemetry/telemetry.options.d.ts +176 -0
- package/dist/telemetry/telemetry.options.d.ts.map +1 -0
- package/dist/telemetry/telemetry.options.js +246 -0
- package/dist/telemetry/telemetry.options.js.map +1 -0
- package/dist/telemetry/telemetry.permissions.d.ts +76 -0
- package/dist/telemetry/telemetry.permissions.d.ts.map +1 -0
- package/dist/telemetry/telemetry.permissions.js +85 -0
- package/dist/telemetry/telemetry.permissions.js.map +1 -0
- package/dist/telemetry/telemetry.settings.d.ts +79 -0
- package/dist/telemetry/telemetry.settings.d.ts.map +1 -0
- package/dist/telemetry/telemetry.settings.js +92 -0
- package/dist/telemetry/telemetry.settings.js.map +1 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.d.ts +17 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.d.ts.map +1 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.js +128 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.js.map +1 -0
- package/dist/telemetry/testing/conformance.d.ts +257 -0
- package/dist/telemetry/testing/conformance.d.ts.map +1 -0
- package/dist/telemetry/testing/conformance.js +626 -0
- package/dist/telemetry/testing/conformance.js.map +1 -0
- package/dist/telemetry/testing/index.d.ts +10 -0
- package/dist/telemetry/testing/index.d.ts.map +1 -0
- package/dist/telemetry/testing/index.js +41 -0
- package/dist/telemetry/testing/index.js.map +1 -0
- package/dist/telemetry/testing/metric-schema.fixture.d.ts +73 -0
- package/dist/telemetry/testing/metric-schema.fixture.d.ts.map +1 -0
- package/dist/telemetry/testing/metric-schema.fixture.js +362 -0
- package/dist/telemetry/testing/metric-schema.fixture.js.map +1 -0
- package/dist/telemetry/testing/stub-ports.d.ts +46 -0
- package/dist/telemetry/testing/stub-ports.d.ts.map +1 -0
- package/dist/telemetry/testing/stub-ports.js +119 -0
- package/dist/telemetry/testing/stub-ports.js.map +1 -0
- package/dist/testing/conformance-suite.d.ts +106 -0
- package/dist/testing/conformance-suite.d.ts.map +1 -0
- package/dist/testing/conformance-suite.js +8 -0
- package/dist/testing/conformance-suite.js.map +1 -0
- package/dist/testing/conformance-suites.d.ts +14 -0
- package/dist/testing/conformance-suites.d.ts.map +1 -0
- package/dist/testing/conformance-suites.js +27 -0
- package/dist/testing/conformance-suites.js.map +1 -0
- package/dist/testing/host/in-memory-audit-sink.d.ts +23 -0
- package/dist/testing/host/in-memory-audit-sink.d.ts.map +1 -0
- package/dist/testing/host/in-memory-audit-sink.js +30 -0
- package/dist/testing/host/in-memory-audit-sink.js.map +1 -0
- package/dist/testing/host/in-memory-system-settings-store.d.ts +31 -0
- package/dist/testing/host/in-memory-system-settings-store.d.ts.map +1 -0
- package/dist/testing/host/in-memory-system-settings-store.js +54 -0
- package/dist/testing/host/in-memory-system-settings-store.js.map +1 -0
- package/dist/testing/host/index.d.ts +4 -0
- package/dist/testing/host/index.d.ts.map +1 -0
- package/dist/testing/host/index.js +13 -0
- package/dist/testing/host/index.js.map +1 -0
- package/dist/testing/host/test-platform-host.d.ts +35 -0
- package/dist/testing/host/test-platform-host.d.ts.map +1 -0
- package/dist/testing/host/test-platform-host.js +81 -0
- package/dist/testing/host/test-platform-host.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +32 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/prisma-schema.d.ts +99 -0
- package/dist/testing/prisma-schema.d.ts.map +1 -0
- package/dist/testing/prisma-schema.js +175 -0
- package/dist/testing/prisma-schema.js.map +1 -0
- package/dist/testing/run-platform-conformance.d.ts +70 -0
- package/dist/testing/run-platform-conformance.d.ts.map +1 -0
- package/dist/testing/run-platform-conformance.js +77 -0
- package/dist/testing/run-platform-conformance.js.map +1 -0
- package/dist/testing/suites/cron-enqueue-only.d.ts +46 -0
- package/dist/testing/suites/cron-enqueue-only.d.ts.map +1 -0
- package/dist/testing/suites/cron-enqueue-only.js +177 -0
- package/dist/testing/suites/cron-enqueue-only.js.map +1 -0
- package/dist/testing/suites/user-owned-data.d.ts +86 -0
- package/dist/testing/suites/user-owned-data.d.ts.map +1 -0
- package/dist/testing/suites/user-owned-data.js +329 -0
- package/dist/testing/suites/user-owned-data.js.map +1 -0
- package/package.json +129 -4
|
@@ -0,0 +1,904 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var TelemetryDashboardService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.UNKNOWN_ROUTES_TOP_N = exports.TelemetryDashboardService = exports.SharedTtlCache = exports.TELEMETRY_DASHBOARD_AUDIT_ACTION = exports.DASHBOARD_LOG_Q_MAX = exports.RUNTIME_MIN_BUCKET_SECONDS = exports.LAST_DATA_LOOKBACK_MS = exports.DASHBOARD_CACHE_MAX_ENTRIES = exports.DASHBOARD_DISTINCT_CACHE_MS = exports.DASHBOARD_RESULT_CACHE_MS = void 0;
|
|
17
|
+
exports.resolveWindow = resolveWindow;
|
|
18
|
+
exports.catalogOf = catalogOf;
|
|
19
|
+
exports.encodeCursor = encodeCursor;
|
|
20
|
+
exports.decodeCursor = decodeCursor;
|
|
21
|
+
exports.nsToMs = nsToMs;
|
|
22
|
+
exports.toDate = toDate;
|
|
23
|
+
exports.bucketStarts = bucketStarts;
|
|
24
|
+
exports.unknownRoutesOf = unknownRoutesOf;
|
|
25
|
+
exports.parseSeverities = parseSeverities;
|
|
26
|
+
exports.auditParams = auditParams;
|
|
27
|
+
const common_1 = require("@nestjs/common");
|
|
28
|
+
const telemetry_dashboard_dto_1 = require("../dto/telemetry-dashboard.dto");
|
|
29
|
+
const greptime_client_1 = require("../greptime/greptime.client");
|
|
30
|
+
const sql_guard_1 = require("../query/sql-guard");
|
|
31
|
+
const telemetry_availability_1 = require("../query/telemetry-availability");
|
|
32
|
+
const telemetry_query_errors_1 = require("../query/telemetry-query.errors");
|
|
33
|
+
const telemetry_schema_service_1 = require("../query/telemetry-schema.service");
|
|
34
|
+
const ports_1 = require("../ports");
|
|
35
|
+
const telemetry_settings_service_1 = require("../telemetry-settings.service");
|
|
36
|
+
const metric_catalog_1 = require("../metrics/metric-catalog");
|
|
37
|
+
const metric_group_1 = require("../metrics/metric-group");
|
|
38
|
+
const metric_sql_1 = require("../metrics/metric-sql");
|
|
39
|
+
const metric_verdict_1 = require("../metrics/metric-verdict");
|
|
40
|
+
const telemetry_dashboard_sql_1 = require("./telemetry-dashboard.sql");
|
|
41
|
+
const telemetry_options_1 = require("../telemetry.options");
|
|
42
|
+
const telemetry_dashboard_verdict_1 = require("./telemetry-dashboard.verdict");
|
|
43
|
+
const verdict_policy_1 = require("./verdict-policy");
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// TelemetryDashboardService — the fixed dashboard over the telemetry store
|
|
46
|
+
// (issue #577, epic #576)
|
|
47
|
+
// =============================================================================
|
|
48
|
+
//
|
|
49
|
+
// Unlike the explorer, NOTHING here is caller-supplied SQL: every statement is
|
|
50
|
+
// a template of `telemetry-dashboard.sql.ts`, filled with validated values.
|
|
51
|
+
// The flow of every route:
|
|
52
|
+
//
|
|
53
|
+
// 1. preconditions (`requireQueryablePolicy`): 503 not configured, 409
|
|
54
|
+
// disabled — checked before the cache, so a disabled store never serves
|
|
55
|
+
// a cached answer;
|
|
56
|
+
// 2. the window: `range` (relative to now) or `from`/`to`, bucket size =
|
|
57
|
+
// span/buckets rounded UP to an allowed size; the previous window is the
|
|
58
|
+
// same span ending at `from`;
|
|
59
|
+
// 3. the 15-second RESULT CACHE, keyed by route + normalized params (a
|
|
60
|
+
// relative range keys by its name, not its instants), with concurrent
|
|
61
|
+
// identical requests sharing one in-flight promise;
|
|
62
|
+
// 4. on a miss: which tables/columns exist (`TelemetrySchemaService`,
|
|
63
|
+
// cached 30 s) so a fresh store degrades to empty panels rather than
|
|
64
|
+
// failing; `service`/`instance` checked against the DISTINCT values seen
|
|
65
|
+
// in the range (cached 60 s) → 400 TELEMETRY_DASHBOARD_BAD_FILTER; then
|
|
66
|
+
// the statements, through the READ-ONLY reader pool with the policy's
|
|
67
|
+
// client-side timeout (summary: all at once, `Promise.all`);
|
|
68
|
+
// 5. an audit row per store read (`telemetry:dashboard`), failures too. A
|
|
69
|
+
// cache hit is not audited: nothing was read from the store.
|
|
70
|
+
//
|
|
71
|
+
// NOT A QUEUE JOB (CLAUDE.md): every statement is bounded by the policy
|
|
72
|
+
// timeout and a literal LIMIT, and none outlives the request. No @Cron, no
|
|
73
|
+
// @OnEvent, no detached promise; the caches expire lazily on read.
|
|
74
|
+
//
|
|
75
|
+
// ⚠ Never log `q` beyond 64 characters, and never log rows.
|
|
76
|
+
// =============================================================================
|
|
77
|
+
exports.DASHBOARD_RESULT_CACHE_MS = 15_000;
|
|
78
|
+
exports.DASHBOARD_DISTINCT_CACHE_MS = 60_000;
|
|
79
|
+
/** Entries each cache keeps at most (oldest evicted first). */
|
|
80
|
+
exports.DASHBOARD_CACHE_MAX_ENTRIES = 500;
|
|
81
|
+
/** How far back "latest data" looks. */
|
|
82
|
+
exports.LAST_DATA_LOOKBACK_MS = 7 * 24 * 60 * 60_000;
|
|
83
|
+
/** Runtime metrics are exported every 60 s: a finer bucket would be half empty. */
|
|
84
|
+
exports.RUNTIME_MIN_BUCKET_SECONDS = 60;
|
|
85
|
+
/** How much of `q` an audit row or log line keeps. */
|
|
86
|
+
exports.DASHBOARD_LOG_Q_MAX = 64;
|
|
87
|
+
exports.TELEMETRY_DASHBOARD_AUDIT_ACTION = 'telemetry:dashboard';
|
|
88
|
+
/** The request's window at `now`. The DTO has already refused conflicting or oversized windows. */
|
|
89
|
+
function resolveWindow(query, now = Date.now()) {
|
|
90
|
+
const buckets = Number(query.buckets ?? telemetry_dashboard_dto_1.DASHBOARD_BUCKET_COUNTS[telemetry_dashboard_dto_1.DASHBOARD_BUCKET_COUNTS.length - 1]);
|
|
91
|
+
let from;
|
|
92
|
+
let to;
|
|
93
|
+
let key;
|
|
94
|
+
if (query.from && query.to) {
|
|
95
|
+
from = new Date(query.from);
|
|
96
|
+
to = new Date(query.to);
|
|
97
|
+
key = `from=${from.toISOString()}&to=${to.toISOString()}`;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const range = query.range ?? telemetry_dashboard_dto_1.DEFAULT_DASHBOARD_RANGE;
|
|
101
|
+
to = new Date(now);
|
|
102
|
+
from = new Date(now - telemetry_dashboard_dto_1.DASHBOARD_RANGE_MS[range]);
|
|
103
|
+
key = `range=${range}`;
|
|
104
|
+
}
|
|
105
|
+
const spanMs = to.getTime() - from.getTime();
|
|
106
|
+
return {
|
|
107
|
+
from,
|
|
108
|
+
to,
|
|
109
|
+
spanMs,
|
|
110
|
+
previousFrom: new Date(from.getTime() - spanMs),
|
|
111
|
+
bucketSeconds: (0, telemetry_dashboard_sql_1.bucketSecondsFor)(spanMs, buckets),
|
|
112
|
+
key: `${key}&buckets=${buckets}`,
|
|
113
|
+
spanKey: key,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** A TTL cache whose concurrent misses for one key share one promise. Failures are not cached. */
|
|
117
|
+
class SharedTtlCache {
|
|
118
|
+
ttlMs;
|
|
119
|
+
maxEntries;
|
|
120
|
+
entries = new Map();
|
|
121
|
+
inflight = new Map();
|
|
122
|
+
constructor(ttlMs, maxEntries = exports.DASHBOARD_CACHE_MAX_ENTRIES) {
|
|
123
|
+
this.ttlMs = ttlMs;
|
|
124
|
+
this.maxEntries = maxEntries;
|
|
125
|
+
}
|
|
126
|
+
get(key, load) {
|
|
127
|
+
const hit = this.entries.get(key);
|
|
128
|
+
if (hit && Date.now() - hit.at < this.ttlMs)
|
|
129
|
+
return Promise.resolve(hit.value);
|
|
130
|
+
if (hit)
|
|
131
|
+
this.entries.delete(key);
|
|
132
|
+
const pending = this.inflight.get(key);
|
|
133
|
+
if (pending)
|
|
134
|
+
return pending;
|
|
135
|
+
const promise = load()
|
|
136
|
+
.then((value) => {
|
|
137
|
+
this.entries.set(key, { value, at: Date.now() });
|
|
138
|
+
this.evict();
|
|
139
|
+
return value;
|
|
140
|
+
})
|
|
141
|
+
.finally(() => {
|
|
142
|
+
this.inflight.delete(key);
|
|
143
|
+
});
|
|
144
|
+
this.inflight.set(key, promise);
|
|
145
|
+
return promise;
|
|
146
|
+
}
|
|
147
|
+
clear() {
|
|
148
|
+
this.entries.clear();
|
|
149
|
+
}
|
|
150
|
+
evict() {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
for (const [key, entry] of this.entries) {
|
|
153
|
+
if (now - entry.at >= this.ttlMs)
|
|
154
|
+
this.entries.delete(key);
|
|
155
|
+
}
|
|
156
|
+
while (this.entries.size > this.maxEntries) {
|
|
157
|
+
const oldest = this.entries.keys().next().value;
|
|
158
|
+
this.entries.delete(oldest);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.SharedTtlCache = SharedTtlCache;
|
|
163
|
+
function catalogOf(schema) {
|
|
164
|
+
const columns = (table) => {
|
|
165
|
+
const found = schema.tables.find((t) => t.name === table);
|
|
166
|
+
return found ? new Set(found.columns.map((c) => c.name)) : null;
|
|
167
|
+
};
|
|
168
|
+
const traces = columns(telemetry_dashboard_sql_1.TRACES_TABLE);
|
|
169
|
+
const logs = columns(telemetry_dashboard_sql_1.LOGS_TABLE);
|
|
170
|
+
return {
|
|
171
|
+
traces: !!traces && telemetry_dashboard_sql_1.REQUIRED_TRACE_COLUMNS.every((c) => traces.has(c)),
|
|
172
|
+
tracesHaveInstance: !!traces && traces.has(telemetry_dashboard_sql_1.TRACE_COLUMNS.instance),
|
|
173
|
+
tracesHaveRouteMatched: !!traces && traces.has(telemetry_dashboard_sql_1.TRACE_COLUMNS.routeMatched),
|
|
174
|
+
tracesHaveBearer: !!traces && traces.has(telemetry_dashboard_sql_1.TRACE_COLUMNS.bearer),
|
|
175
|
+
logs: !!logs && telemetry_dashboard_sql_1.REQUIRED_LOG_COLUMNS.every((c) => logs.has(c)),
|
|
176
|
+
heap: columns(telemetry_dashboard_sql_1.HEAP_USED_TABLE) !== null,
|
|
177
|
+
eventLoop: columns(telemetry_dashboard_sql_1.EVENT_LOOP_P99_TABLE) !== null,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// ---- cursor ------------------------------------------------------------------
|
|
181
|
+
function encodeCursor(cursor) {
|
|
182
|
+
return Buffer.from(JSON.stringify({ ts: cursor.ts, spanId: cursor.spanId }), 'utf8').toString('base64url');
|
|
183
|
+
}
|
|
184
|
+
/** Strictly decodes a cursor, or throws 400 TELEMETRY_DASHBOARD_BAD_CURSOR. */
|
|
185
|
+
function decodeCursor(raw) {
|
|
186
|
+
const bad = () => new telemetry_query_errors_1.TelemetryHttpError(telemetry_query_errors_1.TELEMETRY_ERROR_REASONS.DASHBOARD_BAD_CURSOR, 'The events cursor is not valid.');
|
|
187
|
+
if (!/^[A-Za-z0-9_-]+$/.test(raw))
|
|
188
|
+
throw bad();
|
|
189
|
+
let parsed;
|
|
190
|
+
try {
|
|
191
|
+
parsed = JSON.parse(Buffer.from(raw, 'base64url').toString('utf8'));
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
throw bad();
|
|
195
|
+
}
|
|
196
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
197
|
+
throw bad();
|
|
198
|
+
const keys = Object.keys(parsed).sort();
|
|
199
|
+
if (keys.length !== 2 || keys[0] !== 'spanId' || keys[1] !== 'ts')
|
|
200
|
+
throw bad();
|
|
201
|
+
const { ts, spanId } = parsed;
|
|
202
|
+
if (typeof ts !== 'string' || typeof spanId !== 'string')
|
|
203
|
+
throw bad();
|
|
204
|
+
if (!telemetry_dashboard_sql_1.EVENT_CURSOR_TS_PATTERN.test(ts) || !telemetry_dashboard_sql_1.EVENT_CURSOR_SPAN_PATTERN.test(spanId))
|
|
205
|
+
throw bad();
|
|
206
|
+
if (!Number.isFinite(Date.parse(toIsoText(ts))))
|
|
207
|
+
throw bad();
|
|
208
|
+
return { ts, spanId };
|
|
209
|
+
}
|
|
210
|
+
// ---- value conversion ----------------------------------------------------------
|
|
211
|
+
function num(value) {
|
|
212
|
+
const n = typeof value === 'number' ? value : Number(value);
|
|
213
|
+
return Number.isFinite(n) ? n : 0;
|
|
214
|
+
}
|
|
215
|
+
/** ns (number or UInt64 text) → ms rounded to 0.1, or null. */
|
|
216
|
+
function nsToMs(value) {
|
|
217
|
+
if (value === null || value === undefined || value === '')
|
|
218
|
+
return null;
|
|
219
|
+
const n = Number(value);
|
|
220
|
+
return Number.isFinite(n) ? Math.round(n / 1e5) / 10 : null;
|
|
221
|
+
}
|
|
222
|
+
function round2(value) {
|
|
223
|
+
return Math.round(value * 100) / 100;
|
|
224
|
+
}
|
|
225
|
+
/** The store's timestamp text (`2026-09-27 22:21:00.000000`, UTC) as ISO with `T` and `Z`, full precision. */
|
|
226
|
+
function toIsoText(text) {
|
|
227
|
+
const t = text.replace(' ', 'T');
|
|
228
|
+
return t.endsWith('Z') ? t : `${t}Z`;
|
|
229
|
+
}
|
|
230
|
+
/** A store timestamp as a Date, or null. */
|
|
231
|
+
function toDate(value) {
|
|
232
|
+
if (value === null || value === undefined || value === '')
|
|
233
|
+
return null;
|
|
234
|
+
if (value instanceof Date)
|
|
235
|
+
return Number.isFinite(value.getTime()) ? value : null;
|
|
236
|
+
const ms = Date.parse(toIsoText(String(value)));
|
|
237
|
+
return Number.isFinite(ms) ? new Date(ms) : null;
|
|
238
|
+
}
|
|
239
|
+
function toIso(value) {
|
|
240
|
+
return toDate(value)?.toISOString() ?? null;
|
|
241
|
+
}
|
|
242
|
+
function str(value) {
|
|
243
|
+
return value === null || value === undefined || value === '' ? null : String(value);
|
|
244
|
+
}
|
|
245
|
+
/** Bucket starts covering `[from, to)`, aligned to the epoch like `date_bin`. */
|
|
246
|
+
function bucketStarts(from, to, bucketSeconds) {
|
|
247
|
+
const size = bucketSeconds * 1000;
|
|
248
|
+
const starts = [];
|
|
249
|
+
for (let t = Math.floor(from.getTime() / size) * size; t < to.getTime(); t += size)
|
|
250
|
+
starts.push(t);
|
|
251
|
+
return starts;
|
|
252
|
+
}
|
|
253
|
+
/** Rows keyed by their bucket start (ms), from a column `t`. */
|
|
254
|
+
function byBucket(result) {
|
|
255
|
+
const map = new Map();
|
|
256
|
+
if (!result)
|
|
257
|
+
return map;
|
|
258
|
+
const index = result.fields.findIndex((f) => f.name === 't');
|
|
259
|
+
for (const row of result.rows) {
|
|
260
|
+
const t = toDate(row[index]);
|
|
261
|
+
if (t)
|
|
262
|
+
map.set(t.getTime(), row);
|
|
263
|
+
}
|
|
264
|
+
return map;
|
|
265
|
+
}
|
|
266
|
+
function column(result, name) {
|
|
267
|
+
return result ? result.fields.findIndex((f) => f.name === name) : -1;
|
|
268
|
+
}
|
|
269
|
+
/** Row objects keyed by field name. */
|
|
270
|
+
function objects(result) {
|
|
271
|
+
if (!result)
|
|
272
|
+
return [];
|
|
273
|
+
return result.rows.map((row) => Object.fromEntries(result.fields.map((f, i) => [f.name, row[i]])));
|
|
274
|
+
}
|
|
275
|
+
function periods(result) {
|
|
276
|
+
const rows = objects(result);
|
|
277
|
+
return {
|
|
278
|
+
current: rows.find((r) => r.period === 'current') ?? {},
|
|
279
|
+
previous: rows.find((r) => r.period === 'previous') ?? {},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function severityLabel(severityNumber, text) {
|
|
283
|
+
const label = str(text);
|
|
284
|
+
if (label)
|
|
285
|
+
return label.toLowerCase();
|
|
286
|
+
const n = num(severityNumber);
|
|
287
|
+
if (n >= 17)
|
|
288
|
+
return 'error';
|
|
289
|
+
if (n >= 13)
|
|
290
|
+
return 'warn';
|
|
291
|
+
if (n >= 9)
|
|
292
|
+
return 'info';
|
|
293
|
+
return 'other';
|
|
294
|
+
}
|
|
295
|
+
/** Collects the statements a request ran, in order, and runs them. */
|
|
296
|
+
class StatementRunner {
|
|
297
|
+
greptime;
|
|
298
|
+
timeoutMs;
|
|
299
|
+
sql = [];
|
|
300
|
+
constructor(greptime, timeoutMs) {
|
|
301
|
+
this.greptime = greptime;
|
|
302
|
+
this.timeoutMs = timeoutMs;
|
|
303
|
+
}
|
|
304
|
+
async run(sql) {
|
|
305
|
+
this.sql.push(sql);
|
|
306
|
+
try {
|
|
307
|
+
return await this.greptime.queryReader(sql, { timeoutMs: this.timeoutMs });
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
throw (0, telemetry_availability_1.toTelemetryHttpError)(error);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/** `run`, or null without running when `sql` is null. */
|
|
314
|
+
maybe(sql) {
|
|
315
|
+
return sql ? this.run(sql) : Promise.resolve(null);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
let TelemetryDashboardService = TelemetryDashboardService_1 = class TelemetryDashboardService {
|
|
319
|
+
greptime;
|
|
320
|
+
settings;
|
|
321
|
+
schema;
|
|
322
|
+
auditSink;
|
|
323
|
+
verdictPolicy;
|
|
324
|
+
thresholds;
|
|
325
|
+
metricFreshMs;
|
|
326
|
+
logger = new common_1.Logger(TelemetryDashboardService_1.name);
|
|
327
|
+
results = new SharedTtlCache(exports.DASHBOARD_RESULT_CACHE_MS);
|
|
328
|
+
distinct = new SharedTtlCache(exports.DASHBOARD_DISTINCT_CACHE_MS);
|
|
329
|
+
constructor(greptime, settings, schema, auditSink, verdictPolicy = new verdict_policy_1.DefaultVerdictPolicy(), thresholds = telemetry_dashboard_verdict_1.DEFAULT_VERDICT_THRESHOLDS, metricFreshMs = metric_group_1.METRIC_FRESH_MS) {
|
|
330
|
+
this.greptime = greptime;
|
|
331
|
+
this.settings = settings;
|
|
332
|
+
this.schema = schema;
|
|
333
|
+
this.auditSink = auditSink;
|
|
334
|
+
this.verdictPolicy = verdictPolicy;
|
|
335
|
+
this.thresholds = thresholds;
|
|
336
|
+
this.metricFreshMs = metricFreshMs;
|
|
337
|
+
}
|
|
338
|
+
async summary(userId, query) {
|
|
339
|
+
return this.cached(userId, 'summary', query, {}, (ctx) => this.computeSummary(ctx));
|
|
340
|
+
}
|
|
341
|
+
async timeseries(userId, query) {
|
|
342
|
+
return this.cached(userId, 'timeseries', query, { panel: query.panel }, (ctx) => this.computeTimeseries(ctx, query.panel));
|
|
343
|
+
}
|
|
344
|
+
async top(userId, query) {
|
|
345
|
+
return this.cached(userId, 'top', query, { kind: query.kind }, (ctx) => this.computeTop(ctx, query.kind));
|
|
346
|
+
}
|
|
347
|
+
/** One metric group of the catalog (#601): tiles, series and tables. */
|
|
348
|
+
async metrics(userId, query) {
|
|
349
|
+
return this.cached(userId, 'metrics', query, { group: query.group }, (ctx) => this.computeMetrics(ctx, query.group));
|
|
350
|
+
}
|
|
351
|
+
async events(userId, query) {
|
|
352
|
+
// Validated before the cache, so a malformed cursor is a 400 every time.
|
|
353
|
+
const cursor = query.cursor ? decodeCursor(query.cursor) : null;
|
|
354
|
+
const severities = parseSeverities(query.severity);
|
|
355
|
+
return this.cached(userId, 'events', query, { severity: severities.join(','), q: query.q ?? '', cursor: query.cursor ?? '' }, (ctx) => this.computeEvents(ctx, severities, query.q ?? null, cursor));
|
|
356
|
+
}
|
|
357
|
+
async filters(userId, query) {
|
|
358
|
+
const policy = await (0, telemetry_availability_1.requireQueryablePolicy)(this.greptime, this.settings);
|
|
359
|
+
const window = resolveWindow(query);
|
|
360
|
+
const timeoutMs = policy.query.timeoutSeconds * 1000;
|
|
361
|
+
const started = Date.now();
|
|
362
|
+
const values = await this.distinct.get(window.spanKey, () => this.audited(userId, 'filters', query, started, () => this.loadDistinct(window, timeoutMs)));
|
|
363
|
+
return {
|
|
364
|
+
range: rangeOf(window),
|
|
365
|
+
generatedAt: values.generatedAt,
|
|
366
|
+
truncated: values.truncated,
|
|
367
|
+
sql: values.sql,
|
|
368
|
+
services: values.services,
|
|
369
|
+
instances: values.instances,
|
|
370
|
+
hosts: values.hosts,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
// ---------------------------------------------------------------------------
|
|
374
|
+
/** Preconditions, window, result cache, audit. */
|
|
375
|
+
async cached(userId, route, query, extra, compute) {
|
|
376
|
+
const policy = await (0, telemetry_availability_1.requireQueryablePolicy)(this.greptime, this.settings);
|
|
377
|
+
const window = resolveWindow(query);
|
|
378
|
+
const key = [
|
|
379
|
+
route,
|
|
380
|
+
window.key,
|
|
381
|
+
`service=${query.service ?? ''}`,
|
|
382
|
+
`instance=${query.instance ?? ''}`,
|
|
383
|
+
`host=${query.host ?? ''}`,
|
|
384
|
+
...Object.entries(extra)
|
|
385
|
+
.sort(([a], [b]) => (a < b ? -1 : 1))
|
|
386
|
+
.map(([k, v]) => `${k}=${v}`),
|
|
387
|
+
].join('\u0000');
|
|
388
|
+
const value = await this.results.get(key, () => {
|
|
389
|
+
const started = Date.now();
|
|
390
|
+
return this.audited(userId, route, { ...query, ...extra }, started, async () => {
|
|
391
|
+
const runner = new StatementRunner(this.greptime, policy.query.timeoutSeconds * 1000);
|
|
392
|
+
const schema = await this.schema.getSchema();
|
|
393
|
+
const catalog = catalogOf(schema);
|
|
394
|
+
const tables = (0, metric_catalog_1.metricTablesOf)(schema);
|
|
395
|
+
const filters = await this.validateFilters(window, query, { catalog, tables }, policy.query.timeoutSeconds * 1000);
|
|
396
|
+
return compute({ window, filters, catalog, tables, runner });
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
return value;
|
|
400
|
+
}
|
|
401
|
+
/** Runs `work`, then writes the audit row (for a failure too) and logs the outcome. */
|
|
402
|
+
async audited(userId, route, params, started, work) {
|
|
403
|
+
let result;
|
|
404
|
+
try {
|
|
405
|
+
result = await work();
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
const elapsedMs = Date.now() - started;
|
|
409
|
+
await this.audit(userId, route, params, {
|
|
410
|
+
elapsedMs,
|
|
411
|
+
error: error instanceof Error ? error.message : String(error),
|
|
412
|
+
...(error instanceof telemetry_query_errors_1.TelemetryHttpError ? { reason: error.reason } : {}),
|
|
413
|
+
}).catch((auditError) => {
|
|
414
|
+
this.logger.warn(`Could not audit a failed telemetry dashboard read: ${auditError instanceof Error ? auditError.message : String(auditError)}`);
|
|
415
|
+
});
|
|
416
|
+
throw error;
|
|
417
|
+
}
|
|
418
|
+
const elapsedMs = Date.now() - started;
|
|
419
|
+
const statements = Array.isArray(result.sql) ? result.sql.length : 1;
|
|
420
|
+
this.logger.debug(`Telemetry dashboard ${route}: ${statements} statement(s) in ${elapsedMs} ms`);
|
|
421
|
+
await this.audit(userId, route, params, { elapsedMs, statements, truncated: result.truncated });
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
async audit(userId, route, params, meta) {
|
|
425
|
+
await this.auditSink.record({
|
|
426
|
+
actorUserId: userId,
|
|
427
|
+
action: exports.TELEMETRY_DASHBOARD_AUDIT_ACTION,
|
|
428
|
+
targetType: 'telemetry_store',
|
|
429
|
+
targetId: this.greptime.database,
|
|
430
|
+
meta: { route, params: auditParams(params), ...meta },
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
/** `service`/`instance`/`host` as SQL filters, or 400 when one was not seen in the range. */
|
|
434
|
+
async validateFilters(window, query, known, timeoutMs) {
|
|
435
|
+
const filters = {
|
|
436
|
+
tracesHaveInstance: known.catalog.tracesHaveInstance,
|
|
437
|
+
tracesHaveRouteMatched: known.catalog.tracesHaveRouteMatched,
|
|
438
|
+
tracesHaveBearer: known.catalog.tracesHaveBearer,
|
|
439
|
+
};
|
|
440
|
+
if (!query.service && !query.instance && !query.host)
|
|
441
|
+
return filters;
|
|
442
|
+
const values = await this.distinct.get(window.spanKey, () => this.loadDistinct(window, timeoutMs, known));
|
|
443
|
+
for (const field of ['service', 'instance', 'host']) {
|
|
444
|
+
const wanted = query[field];
|
|
445
|
+
if (wanted === undefined)
|
|
446
|
+
continue;
|
|
447
|
+
const known = field === 'service' ? values.services : field === 'instance' ? values.instances : values.hosts;
|
|
448
|
+
if (!known.includes(wanted)) {
|
|
449
|
+
throw new telemetry_query_errors_1.TelemetryHttpError(telemetry_query_errors_1.TELEMETRY_ERROR_REASONS.DASHBOARD_BAD_FILTER, `The ${field} is not among those seen in the selected range.`, { field });
|
|
450
|
+
}
|
|
451
|
+
filters[field] = wanted;
|
|
452
|
+
}
|
|
453
|
+
return filters;
|
|
454
|
+
}
|
|
455
|
+
async loadDistinct(window, timeoutMs, known) {
|
|
456
|
+
let catalog = known?.catalog;
|
|
457
|
+
let metricTables = known?.tables;
|
|
458
|
+
if (!catalog || !metricTables) {
|
|
459
|
+
const schema = await this.schema.getSchema();
|
|
460
|
+
catalog = catalogOf(schema);
|
|
461
|
+
metricTables = (0, metric_catalog_1.metricTablesOf)(schema);
|
|
462
|
+
}
|
|
463
|
+
const runner = new StatementRunner(this.greptime, timeoutMs);
|
|
464
|
+
const tables = { traces: catalog.traces, logs: catalog.logs };
|
|
465
|
+
const [services, instances, hosts] = await Promise.all([
|
|
466
|
+
runner.maybe((0, telemetry_dashboard_sql_1.distinctServicesSql)(window.from, window.to, tables)),
|
|
467
|
+
runner.maybe((0, telemetry_dashboard_sql_1.distinctInstancesSql)(window.from, window.to, { traces: catalog.tracesHaveInstance, logs: catalog.logs })),
|
|
468
|
+
runner.maybe((0, metric_sql_1.distinctHostsSql)(metricTables.get(metric_catalog_1.HOST_DISTINCT_TABLE) ?? null, metric_catalog_1.HOST_DISTINCT_TABLE, window.from, window.to, telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX + 1)),
|
|
469
|
+
]);
|
|
470
|
+
const list = (result) => (result?.rows ?? []).map((row) => str(row[0])).filter((v) => v !== null);
|
|
471
|
+
const s = list(services);
|
|
472
|
+
const i = list(instances);
|
|
473
|
+
const h = list(hosts);
|
|
474
|
+
return {
|
|
475
|
+
services: s.slice(0, telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX),
|
|
476
|
+
instances: i.slice(0, telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX),
|
|
477
|
+
hosts: h.slice(0, telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX),
|
|
478
|
+
truncated: s.length > telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX || i.length > telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX || h.length > telemetry_dashboard_sql_1.DISTINCT_VALUES_MAX,
|
|
479
|
+
sql: runner.sql,
|
|
480
|
+
generatedAt: new Date(Date.now()).toISOString(),
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
// ---- summary ---------------------------------------------------------------
|
|
484
|
+
async computeSummary({ window, filters, catalog, tables, runner }) {
|
|
485
|
+
const now = new Date(Date.now());
|
|
486
|
+
const runtimeBucket = Math.max(window.bucketSeconds, exports.RUNTIME_MIN_BUCKET_SECONDS);
|
|
487
|
+
const runtimeService = filters.service ?? null;
|
|
488
|
+
const lastDataSince = new Date(now.getTime() - exports.LAST_DATA_LOOKBACK_MS);
|
|
489
|
+
// Infrastructure verdict inputs (#601): one small statement per rule
|
|
490
|
+
// family, null (not run) when its tables are absent.
|
|
491
|
+
const probeSql = (0, metric_verdict_1.verdictProbeSql)(tables, window);
|
|
492
|
+
// Unknown API routes (#650): only when the store has the matched column
|
|
493
|
+
// (see UNKNOWN_ROUTE_PREDICATE); the templates return null otherwise.
|
|
494
|
+
const unknownSql = catalog.traces
|
|
495
|
+
? {
|
|
496
|
+
totals: (0, telemetry_dashboard_sql_1.unknownRoutesTotalsSql)(window.previousFrom, window, filters),
|
|
497
|
+
top: (0, telemetry_dashboard_sql_1.topUnknownRoutesSql)(window, filters, exports.UNKNOWN_ROUTES_TOP_N + 1),
|
|
498
|
+
}
|
|
499
|
+
: { totals: null, top: null };
|
|
500
|
+
const [apiTotals, apiSeries, logsTotals, logsSeries, last, routes, errors, heap, eventLoop, probeResults, unknownTotals, unknownTop] = await Promise.all([
|
|
501
|
+
runner.maybe(catalog.traces ? (0, telemetry_dashboard_sql_1.apiTotalsSql)(window.previousFrom, window, filters) : null),
|
|
502
|
+
runner.maybe(catalog.traces ? (0, telemetry_dashboard_sql_1.apiTimeseriesSql)(window, filters) : null),
|
|
503
|
+
runner.maybe(catalog.logs ? (0, telemetry_dashboard_sql_1.logsTotalsSql)(window.previousFrom, window, filters) : null),
|
|
504
|
+
runner.maybe(catalog.logs ? (0, telemetry_dashboard_sql_1.logsTimeseriesSql)(window, filters) : null),
|
|
505
|
+
runner.maybe(catalog.traces || catalog.logs
|
|
506
|
+
? (0, telemetry_dashboard_sql_1.lastDataSql)(lastDataSince, new Date(now.getTime() + 60_000), filters, {
|
|
507
|
+
traces: catalog.traces,
|
|
508
|
+
logs: catalog.logs,
|
|
509
|
+
})
|
|
510
|
+
: null),
|
|
511
|
+
runner.maybe(catalog.traces ? (0, telemetry_dashboard_sql_1.topRoutesSql)(window, filters) : null),
|
|
512
|
+
runner.maybe(catalog.logs ? (0, telemetry_dashboard_sql_1.topErrorsSql)(window, filters, 1) : null),
|
|
513
|
+
runner.maybe(catalog.heap ? (0, telemetry_dashboard_sql_1.heapUsedSql)(window.previousFrom, window.to, runtimeBucket, runtimeService) : null),
|
|
514
|
+
runner.maybe(catalog.eventLoop ? (0, telemetry_dashboard_sql_1.eventLoopDelayP99Sql)(window.previousFrom, window.to, runtimeBucket, runtimeService) : null),
|
|
515
|
+
Promise.all(metric_verdict_1.VERDICT_PROBES.map((probe) => runner.maybe(probeSql[probe]))),
|
|
516
|
+
runner.maybe(unknownSql.totals),
|
|
517
|
+
runner.maybe(unknownSql.top),
|
|
518
|
+
]);
|
|
519
|
+
const infrastructure = (0, metric_verdict_1.verdictInputsFrom)(Object.fromEntries(metric_verdict_1.VERDICT_PROBES.map((probe, i) => [probe, probeResults[i]])), new Date(Math.min(now.getTime(), window.to.getTime())));
|
|
520
|
+
const api = periods(apiTotals);
|
|
521
|
+
const logs = periods(logsTotals);
|
|
522
|
+
const requests = num(api.current.requests);
|
|
523
|
+
const previousRequests = num(api.previous.requests);
|
|
524
|
+
const errors5xx = num(api.current.errors);
|
|
525
|
+
const previousErrors5xx = num(api.previous.errors);
|
|
526
|
+
const p95Ms = nsToMs(api.current.p95_ns);
|
|
527
|
+
const errorLogs = num(logs.current.error);
|
|
528
|
+
const previousErrorLogs = num(logs.previous.error);
|
|
529
|
+
const lastRow = objects(last)[0] ?? {};
|
|
530
|
+
const lastDates = [toDate(lastRow.traces_last), toDate(lastRow.logs_last)].filter((d) => d !== null);
|
|
531
|
+
const lastDataAt = lastDates.length ? new Date(Math.max(...lastDates.map((d) => d.getTime()))) : null;
|
|
532
|
+
const routeRows = objects(routes);
|
|
533
|
+
const topErrorRow = routeRows.find((r) => num(r.errors) > 0);
|
|
534
|
+
// Streaming (SSE) routes are never the latency offender: their span is the
|
|
535
|
+
// connection's lifetime (see STREAM_SPAN_PREDICATE).
|
|
536
|
+
const slowest = routeRows.filter((r) => !(0, telemetry_dashboard_sql_1.isStreamingRoute)(str(r.route))).reduce((worst, r) => ((nsToMs(r.p95_ns) ?? -1) > (worst ? nsToMs(worst.p95_ns) ?? -1 : -1) ? r : worst), null);
|
|
537
|
+
const routeLabel = (r) => r ? [str(r.method), str(r.route)].filter(Boolean).join(' ') || null : null;
|
|
538
|
+
// `sql`: the two statements exactly as run above (per-route list first),
|
|
539
|
+
// for the panel's "Open in Explorer" without parsing the summary's `sql`.
|
|
540
|
+
const unknownRoutes = unknownSql.totals
|
|
541
|
+
? unknownRoutesOf(unknownTotals, unknownTop, [unknownSql.top, unknownSql.totals].filter((q) => !!q))
|
|
542
|
+
: null;
|
|
543
|
+
const verdict = this.verdictPolicy.compute({
|
|
544
|
+
now,
|
|
545
|
+
lastDataAt,
|
|
546
|
+
requests,
|
|
547
|
+
errors5xx,
|
|
548
|
+
p95Ms,
|
|
549
|
+
errorLogs,
|
|
550
|
+
previousErrorLogs,
|
|
551
|
+
topErrorRoute: routeLabel(topErrorRow),
|
|
552
|
+
slowestRoute: routeLabel(slowest),
|
|
553
|
+
topErrorMessage: str(objects(errors)[0]?.message),
|
|
554
|
+
unknownRoutes: unknownRoutes
|
|
555
|
+
? {
|
|
556
|
+
bearerRequests: unknownRoutes.bearer,
|
|
557
|
+
bearerRoutes: unknownRoutes.topRoutes.filter((r) => r.bearer > 0).length,
|
|
558
|
+
topRoute: routeLabel(unknownRoutes.topRoutes.find((r) => r.bearer > 0)),
|
|
559
|
+
}
|
|
560
|
+
: null,
|
|
561
|
+
...infrastructure,
|
|
562
|
+
}, this.thresholds);
|
|
563
|
+
const starts = bucketStarts(window.from, window.to, window.bucketSeconds);
|
|
564
|
+
const apiBuckets = byBucket(apiSeries);
|
|
565
|
+
const logBuckets = byBucket(logsSeries);
|
|
566
|
+
const at = (result, name) => column(result, name);
|
|
567
|
+
const spanMin = window.spanMs / 60_000;
|
|
568
|
+
const bucketMin = window.bucketSeconds / 60;
|
|
569
|
+
const apiSpark = (pick) => starts.map((t) => {
|
|
570
|
+
const row = apiBuckets.get(t);
|
|
571
|
+
return row ? pick(row) : null;
|
|
572
|
+
});
|
|
573
|
+
const totalAt = at(apiSeries, 'total');
|
|
574
|
+
const s5xxAt = at(apiSeries, 's5xx');
|
|
575
|
+
const p95At = at(apiSeries, 'p95_ns');
|
|
576
|
+
const tiles = [
|
|
577
|
+
{
|
|
578
|
+
key: 'requestsPerMin',
|
|
579
|
+
label: 'Requests / min',
|
|
580
|
+
value: round2(requests / spanMin),
|
|
581
|
+
previous: round2(previousRequests / spanMin),
|
|
582
|
+
unit: 'req/min',
|
|
583
|
+
sparkline: starts.map((t) => round2(num(apiBuckets.get(t)?.[totalAt]) / bucketMin)),
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
key: 'errorRatePct',
|
|
587
|
+
label: '5xx rate',
|
|
588
|
+
value: requests ? round2((errors5xx / requests) * 100) : null,
|
|
589
|
+
previous: previousRequests ? round2((previousErrors5xx / previousRequests) * 100) : null,
|
|
590
|
+
unit: '%',
|
|
591
|
+
sparkline: apiSpark((row) => {
|
|
592
|
+
const total = num(row[totalAt]);
|
|
593
|
+
return total ? round2((num(row[s5xxAt]) / total) * 100) : null;
|
|
594
|
+
}),
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
key: 'p95Ms',
|
|
598
|
+
label: 'p95 latency',
|
|
599
|
+
value: p95Ms,
|
|
600
|
+
previous: nsToMs(api.previous.p95_ns),
|
|
601
|
+
unit: 'ms',
|
|
602
|
+
sparkline: apiSpark((row) => nsToMs(row[p95At])),
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
key: 'errorLogs',
|
|
606
|
+
label: 'Error logs',
|
|
607
|
+
value: errorLogs,
|
|
608
|
+
previous: previousErrorLogs,
|
|
609
|
+
unit: 'count',
|
|
610
|
+
sparkline: starts.map((t) => num(logBuckets.get(t)?.[at(logsSeries, 'error')])),
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
key: 'warnLogs',
|
|
614
|
+
label: 'Warning logs',
|
|
615
|
+
value: num(logs.current.warn),
|
|
616
|
+
previous: num(logs.previous.warn),
|
|
617
|
+
unit: 'count',
|
|
618
|
+
sparkline: starts.map((t) => num(logBuckets.get(t)?.[at(logsSeries, 'warn')])),
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
// #650: requests answered by the not-found handler. Null when the
|
|
622
|
+
// store has no `app.route.matched` column yet (old data): unknown,
|
|
623
|
+
// not zero. The bearer/anonymous split is `unknownRoutes` below.
|
|
624
|
+
key: 'unknownRoutes',
|
|
625
|
+
label: 'Unknown API routes',
|
|
626
|
+
value: unknownRoutes ? unknownRoutes.requests : null,
|
|
627
|
+
previous: unknownRoutes ? unknownRoutes.previousRequests : null,
|
|
628
|
+
unit: 'count',
|
|
629
|
+
sparkline: [],
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
key: 'lastDataAt',
|
|
633
|
+
label: 'Last data',
|
|
634
|
+
value: lastDataAt?.toISOString() ?? null,
|
|
635
|
+
previous: null,
|
|
636
|
+
unit: 'timestamp',
|
|
637
|
+
sparkline: [],
|
|
638
|
+
},
|
|
639
|
+
];
|
|
640
|
+
const runtime = [];
|
|
641
|
+
if (catalog.heap)
|
|
642
|
+
runtime.push(runtimeTile('heapUsedBytes', 'Heap used', 'bytes', heap, window, runtimeBucket, (v) => Math.round(v)));
|
|
643
|
+
if (catalog.eventLoop) {
|
|
644
|
+
runtime.push(runtimeTile('eventLoopDelayP99Ms', 'Event-loop delay p99', 'ms', eventLoop, window, runtimeBucket, (v) => Math.round(v * 10) / 10));
|
|
645
|
+
}
|
|
646
|
+
return {
|
|
647
|
+
range: rangeOf(window),
|
|
648
|
+
generatedAt: now.toISOString(),
|
|
649
|
+
truncated: false,
|
|
650
|
+
sql: runner.sql,
|
|
651
|
+
verdict,
|
|
652
|
+
tiles,
|
|
653
|
+
...(runtime.length ? { runtime } : {}),
|
|
654
|
+
...(unknownRoutes ? { unknownRoutes } : {}),
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
// ---- metrics (#601) --------------------------------------------------------
|
|
658
|
+
async computeMetrics({ window, filters, tables, runner }, group) {
|
|
659
|
+
const now = new Date(Date.now());
|
|
660
|
+
const freshMs = this.metricFreshMs ?? metric_group_1.METRIC_FRESH_MS;
|
|
661
|
+
const result = await (0, metric_group_1.computeMetricGroup)({ group, window, filters, tables, runner, now, freshMs });
|
|
662
|
+
return {
|
|
663
|
+
range: { from: window.from.toISOString(), to: window.to.toISOString(), bucketSeconds: result.bucketSeconds },
|
|
664
|
+
generatedAt: now.toISOString(),
|
|
665
|
+
truncated: result.truncated,
|
|
666
|
+
sql: runner.sql,
|
|
667
|
+
group,
|
|
668
|
+
available: result.available,
|
|
669
|
+
tiles: result.tiles,
|
|
670
|
+
series: result.series,
|
|
671
|
+
tables: result.tables,
|
|
672
|
+
skipped: result.skipped,
|
|
673
|
+
freshMs,
|
|
674
|
+
};
|
|
675
|
+
}
|
|
676
|
+
// ---- timeseries --------------------------------------------------------------
|
|
677
|
+
async computeTimeseries({ window, filters, catalog, runner }, panel) {
|
|
678
|
+
const starts = bucketStarts(window.from, window.to, window.bucketSeconds);
|
|
679
|
+
const envelope = (sql) => ({
|
|
680
|
+
range: rangeOf(window),
|
|
681
|
+
generatedAt: new Date(Date.now()).toISOString(),
|
|
682
|
+
truncated: false,
|
|
683
|
+
sql: sql[0] ?? '',
|
|
684
|
+
});
|
|
685
|
+
if (panel === 'api') {
|
|
686
|
+
const result = await runner.maybe(catalog.traces ? (0, telemetry_dashboard_sql_1.apiTimeseriesSql)(window, filters) : null);
|
|
687
|
+
const rows = byBucket(result);
|
|
688
|
+
const i = (name) => column(result, name);
|
|
689
|
+
return {
|
|
690
|
+
...envelope(runner.sql),
|
|
691
|
+
panel,
|
|
692
|
+
buckets: starts.map((t) => {
|
|
693
|
+
const row = rows.get(t);
|
|
694
|
+
return {
|
|
695
|
+
t: new Date(t).toISOString(),
|
|
696
|
+
s2xx: num(row?.[i('s2xx')]),
|
|
697
|
+
s3xx: num(row?.[i('s3xx')]),
|
|
698
|
+
s4xx: num(row?.[i('s4xx')]),
|
|
699
|
+
s5xx: num(row?.[i('s5xx')]),
|
|
700
|
+
p95Ms: row ? nsToMs(row[i('p95_ns')]) : null,
|
|
701
|
+
};
|
|
702
|
+
}),
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
const result = await runner.maybe(catalog.logs ? (0, telemetry_dashboard_sql_1.logsTimeseriesSql)(window, filters) : null);
|
|
706
|
+
const rows = byBucket(result);
|
|
707
|
+
const i = (name) => column(result, name);
|
|
708
|
+
return {
|
|
709
|
+
...envelope(runner.sql),
|
|
710
|
+
panel,
|
|
711
|
+
buckets: starts.map((t) => {
|
|
712
|
+
const row = rows.get(t);
|
|
713
|
+
return {
|
|
714
|
+
t: new Date(t).toISOString(),
|
|
715
|
+
error: num(row?.[i('error')]),
|
|
716
|
+
warn: num(row?.[i('warn')]),
|
|
717
|
+
info: num(row?.[i('info')]),
|
|
718
|
+
other: num(row?.[i('other')]),
|
|
719
|
+
};
|
|
720
|
+
}),
|
|
721
|
+
};
|
|
722
|
+
}
|
|
723
|
+
// ---- top ---------------------------------------------------------------------
|
|
724
|
+
async computeTop({ window, filters, catalog, runner }, kind) {
|
|
725
|
+
const base = () => ({ range: rangeOf(window), generatedAt: new Date(Date.now()).toISOString(), sql: runner.sql[0] ?? '' });
|
|
726
|
+
if (kind === 'routes') {
|
|
727
|
+
const rows = objects(await runner.maybe(catalog.traces ? (0, telemetry_dashboard_sql_1.topRoutesSql)(window, filters) : null));
|
|
728
|
+
return {
|
|
729
|
+
...base(),
|
|
730
|
+
truncated: rows.length > telemetry_dashboard_sql_1.TOP_N,
|
|
731
|
+
kind,
|
|
732
|
+
items: rows.slice(0, telemetry_dashboard_sql_1.TOP_N).map((r) => {
|
|
733
|
+
const count = num(r.requests);
|
|
734
|
+
const errors = num(r.errors);
|
|
735
|
+
const unknownRequests = num(r.unknown_requests);
|
|
736
|
+
return {
|
|
737
|
+
method: str(r.method),
|
|
738
|
+
route: str(r.route),
|
|
739
|
+
count,
|
|
740
|
+
errors,
|
|
741
|
+
errorRatePct: count ? round2((errors / count) * 100) : 0,
|
|
742
|
+
clientErrors: num(r.client_errors),
|
|
743
|
+
unknownRequests,
|
|
744
|
+
unknown: unknownRequests > 0,
|
|
745
|
+
p95Ms: nsToMs(r.p95_ns),
|
|
746
|
+
};
|
|
747
|
+
}),
|
|
748
|
+
};
|
|
749
|
+
}
|
|
750
|
+
const rows = objects(await runner.maybe(catalog.logs ? (0, telemetry_dashboard_sql_1.topErrorsSql)(window, filters) : null));
|
|
751
|
+
return {
|
|
752
|
+
...base(),
|
|
753
|
+
truncated: rows.length > telemetry_dashboard_sql_1.TOP_N,
|
|
754
|
+
kind,
|
|
755
|
+
items: rows.slice(0, telemetry_dashboard_sql_1.TOP_N).map((r) => ({
|
|
756
|
+
message: str(r.message),
|
|
757
|
+
count: num(r.occurrences),
|
|
758
|
+
firstSeen: toIso(r.first_seen),
|
|
759
|
+
lastSeen: toIso(r.last_seen),
|
|
760
|
+
sampleTraceId: str(r.sample_trace_id),
|
|
761
|
+
service: str(r.service),
|
|
762
|
+
})),
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
// ---- events ------------------------------------------------------------------
|
|
766
|
+
async computeEvents({ window, filters, catalog, runner }, severities, q, cursor) {
|
|
767
|
+
const envelope = { range: rangeOf(window), generatedAt: new Date(Date.now()).toISOString(), truncated: false };
|
|
768
|
+
if (!catalog.logs) {
|
|
769
|
+
return { ...envelope, sql: '', items: [], nextCursor: null };
|
|
770
|
+
}
|
|
771
|
+
const sql = (0, telemetry_dashboard_sql_1.eventsSql)(window, filters, { severities, q, cursor, limit: telemetry_dashboard_sql_1.EVENTS_PAGE_SIZE + 1 });
|
|
772
|
+
// Defence in depth: the statement is server-authored, but it carries user
|
|
773
|
+
// text, so it must still be exactly one read-only statement.
|
|
774
|
+
try {
|
|
775
|
+
(0, sql_guard_1.analyzeStatement)(sql);
|
|
776
|
+
}
|
|
777
|
+
catch (error) {
|
|
778
|
+
throw (0, telemetry_availability_1.toTelemetryHttpError)(error);
|
|
779
|
+
}
|
|
780
|
+
const rows = objects(await runner.run(sql));
|
|
781
|
+
const keyOf = (r) => `${String(r.ts)}\u0000${String(r.span_id ?? '')}`;
|
|
782
|
+
let page = rows.slice(0, telemetry_dashboard_sql_1.EVENTS_PAGE_SIZE);
|
|
783
|
+
const more = rows.length > telemetry_dashboard_sql_1.EVENTS_PAGE_SIZE;
|
|
784
|
+
if (more) {
|
|
785
|
+
// Keyset pagination is strict on (timestamp, span_id): rows sharing the
|
|
786
|
+
// boundary key with the first row of the NEXT page would be skipped, so
|
|
787
|
+
// the page ends before them (unless the whole page shares one key).
|
|
788
|
+
const boundary = keyOf(rows[telemetry_dashboard_sql_1.EVENTS_PAGE_SIZE]);
|
|
789
|
+
let end = telemetry_dashboard_sql_1.EVENTS_PAGE_SIZE;
|
|
790
|
+
while (end > 0 && keyOf(rows[end - 1]) === boundary)
|
|
791
|
+
end--;
|
|
792
|
+
if (end > 0)
|
|
793
|
+
page = rows.slice(0, end);
|
|
794
|
+
}
|
|
795
|
+
const last = page[page.length - 1];
|
|
796
|
+
return {
|
|
797
|
+
...envelope,
|
|
798
|
+
sql,
|
|
799
|
+
items: page.map((r) => ({
|
|
800
|
+
timestamp: toIsoText(String(r.ts)),
|
|
801
|
+
severity: severityLabel(r.severity_number, r.severity_text),
|
|
802
|
+
service: str(r.service),
|
|
803
|
+
body: r.body === null || r.body === undefined ? null : String(r.body),
|
|
804
|
+
traceId: str(r.trace_id),
|
|
805
|
+
spanId: str(r.span_id),
|
|
806
|
+
})),
|
|
807
|
+
nextCursor: more && last ? encodeCursor({ ts: String(last.ts), spanId: String(last.span_id ?? '') }) : null,
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
};
|
|
811
|
+
exports.TelemetryDashboardService = TelemetryDashboardService;
|
|
812
|
+
exports.TelemetryDashboardService = TelemetryDashboardService = TelemetryDashboardService_1 = __decorate([
|
|
813
|
+
(0, common_1.Injectable)(),
|
|
814
|
+
__param(3, (0, common_1.Inject)(ports_1.TELEMETRY_AUDIT_SINK)),
|
|
815
|
+
__param(4, (0, common_1.Inject)(verdict_policy_1.VERDICT_POLICY)),
|
|
816
|
+
__param(5, (0, common_1.Inject)(telemetry_options_1.TELEMETRY_VERDICT_THRESHOLDS)),
|
|
817
|
+
__param(6, (0, common_1.Optional)()),
|
|
818
|
+
__param(6, (0, common_1.Inject)(telemetry_options_1.TELEMETRY_METRIC_FRESH_MS)),
|
|
819
|
+
__metadata("design:paramtypes", [greptime_client_1.GreptimeClient,
|
|
820
|
+
telemetry_settings_service_1.TelemetrySettingsService,
|
|
821
|
+
telemetry_schema_service_1.TelemetrySchemaService, Object, Object, Object, Number])
|
|
822
|
+
], TelemetryDashboardService);
|
|
823
|
+
/** Unknown API routes the summary lists (#650); a short list, the verdict only needs 3 or more. */
|
|
824
|
+
exports.UNKNOWN_ROUTES_TOP_N = 5;
|
|
825
|
+
/** The summary's `unknownRoutes` block from its two statements (#650). */
|
|
826
|
+
function unknownRoutesOf(totals, top, sql) {
|
|
827
|
+
const p = periods(totals);
|
|
828
|
+
const requests = num(p.current.requests);
|
|
829
|
+
const bearer = num(p.current.bearer);
|
|
830
|
+
const previousRequests = num(p.previous.requests);
|
|
831
|
+
const previousBearer = num(p.previous.bearer);
|
|
832
|
+
const rows = objects(top);
|
|
833
|
+
return {
|
|
834
|
+
requests,
|
|
835
|
+
bearer,
|
|
836
|
+
anonymous: Math.max(requests - bearer, 0),
|
|
837
|
+
previousRequests,
|
|
838
|
+
previousBearer,
|
|
839
|
+
topRoutes: rows.slice(0, exports.UNKNOWN_ROUTES_TOP_N).map((r) => {
|
|
840
|
+
const count = num(r.requests);
|
|
841
|
+
const withBearer = num(r.bearer);
|
|
842
|
+
return {
|
|
843
|
+
method: str(r.method),
|
|
844
|
+
route: str(r.route),
|
|
845
|
+
count,
|
|
846
|
+
bearer: withBearer,
|
|
847
|
+
anonymous: Math.max(count - withBearer, 0),
|
|
848
|
+
};
|
|
849
|
+
}),
|
|
850
|
+
truncated: rows.length > exports.UNKNOWN_ROUTES_TOP_N,
|
|
851
|
+
sql,
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
function rangeOf(window) {
|
|
855
|
+
return { from: window.from.toISOString(), to: window.to.toISOString(), bucketSeconds: window.bucketSeconds };
|
|
856
|
+
}
|
|
857
|
+
function parseSeverities(raw) {
|
|
858
|
+
if (!raw)
|
|
859
|
+
return ['error', 'warn'];
|
|
860
|
+
const wanted = new Set(raw.split(','));
|
|
861
|
+
return telemetry_dashboard_sql_1.EVENT_SEVERITIES.filter((s) => wanted.has(s));
|
|
862
|
+
}
|
|
863
|
+
/**
|
|
864
|
+
* Request parameters as an audit row keeps them: control characters removed
|
|
865
|
+
* (PostgreSQL's jsonb refuses `\u0000`), `q` cut to 64 characters, the cursor
|
|
866
|
+
* only as present.
|
|
867
|
+
*/
|
|
868
|
+
function auditParams(params) {
|
|
869
|
+
const out = {};
|
|
870
|
+
for (const [key, value] of Object.entries(params)) {
|
|
871
|
+
if (value === undefined || value === null || value === '')
|
|
872
|
+
continue;
|
|
873
|
+
const text = String(value).replace(/[\u0000-\u001f\u007f]/g, '');
|
|
874
|
+
if (key === 'q')
|
|
875
|
+
out.q = text.slice(0, exports.DASHBOARD_LOG_Q_MAX);
|
|
876
|
+
else if (key === 'cursor')
|
|
877
|
+
out.cursor = true;
|
|
878
|
+
else
|
|
879
|
+
out[key] = text;
|
|
880
|
+
}
|
|
881
|
+
return out;
|
|
882
|
+
}
|
|
883
|
+
function runtimeTile(key, label, unit, result, window, bucketSeconds, round) {
|
|
884
|
+
const rows = byBucket(result);
|
|
885
|
+
const vAt = column(result, 'v');
|
|
886
|
+
const value = (row) => {
|
|
887
|
+
if (!row)
|
|
888
|
+
return null;
|
|
889
|
+
const v = row[vAt];
|
|
890
|
+
if (v === null || v === undefined || v === '')
|
|
891
|
+
return null;
|
|
892
|
+
const n = Number(v);
|
|
893
|
+
return Number.isFinite(n) ? round(n) : null;
|
|
894
|
+
};
|
|
895
|
+
const sparkline = bucketStarts(window.from, window.to, bucketSeconds).map((t) => value(rows.get(t)));
|
|
896
|
+
const lastOf = (list) => [...list].reverse().find((v) => v !== null) ?? null;
|
|
897
|
+
const fromMs = window.from.getTime();
|
|
898
|
+
const previous = [...rows.entries()]
|
|
899
|
+
.filter(([t]) => t < fromMs)
|
|
900
|
+
.sort(([a], [b]) => a - b)
|
|
901
|
+
.map(([, row]) => value(row));
|
|
902
|
+
return { key, label, value: lastOf(sparkline), previous: lastOf(previous), unit, sparkline };
|
|
903
|
+
}
|
|
904
|
+
//# sourceMappingURL=telemetry-dashboard.service.js.map
|