@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,193 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createTelemetryExplorerController = createTelemetryExplorerController;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const index_1 = require("../core/index");
|
|
19
|
+
const telemetry_query_dto_1 = require("./dto/telemetry-query.dto");
|
|
20
|
+
const telemetry_export_service_1 = require("./export/telemetry-export.service");
|
|
21
|
+
const telemetry_query_service_1 = require("./query/telemetry-query.service");
|
|
22
|
+
const telemetry_schema_service_1 = require("./query/telemetry-schema.service");
|
|
23
|
+
const telemetry_permissions_1 = require("./telemetry.permissions");
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// TelemetryExplorerController (issue #535, epic #528)
|
|
26
|
+
// =============================================================================
|
|
27
|
+
//
|
|
28
|
+
// POST /api/admin/telemetry/query telemetry:query
|
|
29
|
+
// GET /api/admin/telemetry/schema telemetry:query
|
|
30
|
+
// POST /api/admin/telemetry/export telemetry:query (binary attachment)
|
|
31
|
+
//
|
|
32
|
+
// All three on `telemetry:query` — the permission that means "may read the
|
|
33
|
+
// telemetry DATA", distinct from `telemetry:read` (may see the store's
|
|
34
|
+
// configuration and status). The schema is on it too: table and column names
|
|
35
|
+
// are derived from the data (every span attribute becomes a column).
|
|
36
|
+
//
|
|
37
|
+
// Failures carry `details.reason` (see query/telemetry-query.errors.ts).
|
|
38
|
+
// =============================================================================
|
|
39
|
+
const ERROR_REASONS_DOC = 'Failures carry `details.reason`: `TELEMETRY_NOT_CONFIGURED` (503, no telemetry store in this ' +
|
|
40
|
+
'deployment), `TELEMETRY_UNREACHABLE` (503), `TELEMETRY_DISABLED` (409, `telemetry.enabled` ' +
|
|
41
|
+
'is off)';
|
|
42
|
+
const QUERY_REASONS_DOC = ', `TELEMETRY_QUERY_REJECTED` (400, not exactly one read-only statement), ' +
|
|
43
|
+
'`TELEMETRY_QUERY_FAILED` (400, the telemetry store refused the statement — the message is its ' +
|
|
44
|
+
'own) and `TELEMETRY_QUERY_TIMEOUT` (504, the statement outran `telemetry.query.timeoutSeconds`).';
|
|
45
|
+
/**
|
|
46
|
+
* Creates the `TelemetryExplorerController` class for one set of module options: its routes
|
|
47
|
+
* guarded by the app's access decorators (`options.host.access`), the caller
|
|
48
|
+
* resolved by `options.actorId`. `TelemetryModule.forRoot()` calls it.
|
|
49
|
+
*
|
|
50
|
+
* @param options - the resolved module options.
|
|
51
|
+
* @returns the controller class.
|
|
52
|
+
*
|
|
53
|
+
* @stability experimental
|
|
54
|
+
*/
|
|
55
|
+
function createTelemetryExplorerController(options) {
|
|
56
|
+
const access = options.host.access;
|
|
57
|
+
const ActorId = options.actorIdParam;
|
|
58
|
+
let TelemetryExplorerController = class TelemetryExplorerController {
|
|
59
|
+
queries;
|
|
60
|
+
schema;
|
|
61
|
+
exports;
|
|
62
|
+
constructor(queries, schema, exports) {
|
|
63
|
+
this.queries = queries;
|
|
64
|
+
this.schema = schema;
|
|
65
|
+
this.exports = exports;
|
|
66
|
+
}
|
|
67
|
+
async query(dto, userId) {
|
|
68
|
+
return this.queries.run(userId, dto.sql, { maxRows: dto.maxRows, source: 'explorer' });
|
|
69
|
+
}
|
|
70
|
+
async getSchema() {
|
|
71
|
+
return this.schema.getSchema();
|
|
72
|
+
}
|
|
73
|
+
async export(dto, userId, reply) {
|
|
74
|
+
const file = await this.exports.export(userId, dto.sql, dto.format);
|
|
75
|
+
return reply
|
|
76
|
+
.status(200)
|
|
77
|
+
.header('Content-Type', file.contentType)
|
|
78
|
+
.header('Content-Disposition', `attachment; filename="${file.filename}"`)
|
|
79
|
+
.header('Content-Length', String(file.buffer.length))
|
|
80
|
+
.header('Cache-Control', 'no-store')
|
|
81
|
+
.header('X-Content-Type-Options', 'nosniff')
|
|
82
|
+
.header('X-Telemetry-Row-Count', String(file.rowCount))
|
|
83
|
+
.header('X-Telemetry-Truncated', String(file.truncated))
|
|
84
|
+
.send(file.buffer);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
__decorate([
|
|
88
|
+
(0, common_1.Post)('query'),
|
|
89
|
+
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
|
|
90
|
+
(access.requirePermissions([telemetry_permissions_1.TELEMETRY_PERMISSIONS.QUERY])),
|
|
91
|
+
(0, swagger_1.ApiOperation)({
|
|
92
|
+
summary: 'Run a read-only SQL query against the telemetry store (Admin only)',
|
|
93
|
+
description: 'Runs ONE read-only statement (SELECT, WITH, SHOW, DESCRIBE, EXPLAIN) as the telemetry ' +
|
|
94
|
+
'store\'s read-only user. At most `maxRows` rows are returned (default and ceiling: the ' +
|
|
95
|
+
'`telemetry.query.maxRows` setting); `truncated` says whether more matched. Rows are ' +
|
|
96
|
+
'positional arrays matching `columns`; `int8`/`numeric` values are strings so no precision ' +
|
|
97
|
+
'is lost, and timestamps are the store\'s own text. That text carries microseconds (the ' +
|
|
98
|
+
'PostgreSQL protocol\'s precision); select `CAST(ts AS STRING) AS ts_ns` for nanoseconds. Every call, ' +
|
|
99
|
+
'refused ones included, is written to the audit log as `telemetry:query`.\n\n' +
|
|
100
|
+
ERROR_REASONS_DOC +
|
|
101
|
+
QUERY_REASONS_DOC,
|
|
102
|
+
}),
|
|
103
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: 'The query result', type: telemetry_query_dto_1.TelemetryQueryResultDto }),
|
|
104
|
+
(0, swagger_1.ApiResponse)({ status: 400, description: 'Validation error, refused or failed statement', type: index_1.ErrorDto }),
|
|
105
|
+
(0, swagger_1.ApiResponse)({ status: 409, description: 'Telemetry is disabled', type: index_1.ErrorDto }),
|
|
106
|
+
(0, swagger_1.ApiResponse)({ status: 503, description: 'No telemetry store, or it did not answer', type: index_1.ErrorDto }),
|
|
107
|
+
(0, swagger_1.ApiResponse)({ status: 504, description: 'The statement timed out', type: index_1.ErrorDto }),
|
|
108
|
+
__param(0, (0, common_1.Body)()),
|
|
109
|
+
__param(1, ActorId()),
|
|
110
|
+
__metadata("design:type", Function),
|
|
111
|
+
__metadata("design:paramtypes", [telemetry_query_dto_1.TelemetryQueryRequestDto, String]),
|
|
112
|
+
__metadata("design:returntype", Promise)
|
|
113
|
+
], TelemetryExplorerController.prototype, "query", null);
|
|
114
|
+
__decorate([
|
|
115
|
+
(0, common_1.Get)('schema'),
|
|
116
|
+
(access.requirePermissions([telemetry_permissions_1.TELEMETRY_PERMISSIONS.QUERY])),
|
|
117
|
+
(0, swagger_1.ApiOperation)({
|
|
118
|
+
summary: 'List the telemetry tables and their columns (Admin only)',
|
|
119
|
+
description: 'Every table of the telemetry database with its row estimate and columns (name, SQL type, ' +
|
|
120
|
+
'and GreptimeDB\'s semantic type: `TAG`, `FIELD` or `TIMESTAMP`), sorted by table name and ' +
|
|
121
|
+
'column position. Cached for up to 30 seconds: tables appear on first write and attribute ' +
|
|
122
|
+
'columns as new attributes arrive.\n\n' +
|
|
123
|
+
ERROR_REASONS_DOC +
|
|
124
|
+
' and `TELEMETRY_QUERY_TIMEOUT` (504).',
|
|
125
|
+
}),
|
|
126
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: 'The telemetry schema', type: telemetry_query_dto_1.TelemetrySchemaDto }),
|
|
127
|
+
(0, swagger_1.ApiResponse)({ status: 409, description: 'Telemetry is disabled', type: index_1.ErrorDto }),
|
|
128
|
+
(0, swagger_1.ApiResponse)({ status: 503, description: 'No telemetry store, or it did not answer', type: index_1.ErrorDto }),
|
|
129
|
+
(0, swagger_1.ApiResponse)({ status: 504, description: 'The schema read timed out', type: index_1.ErrorDto }),
|
|
130
|
+
__metadata("design:type", Function),
|
|
131
|
+
__metadata("design:paramtypes", []),
|
|
132
|
+
__metadata("design:returntype", Promise)
|
|
133
|
+
], TelemetryExplorerController.prototype, "getSchema", null);
|
|
134
|
+
__decorate([
|
|
135
|
+
(0, common_1.Post)('export'),
|
|
136
|
+
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
|
|
137
|
+
(access.requirePermissions([telemetry_permissions_1.TELEMETRY_PERMISSIONS.QUERY])),
|
|
138
|
+
(0, swagger_1.ApiOperation)({
|
|
139
|
+
summary: 'Export a telemetry query result as a file (Admin only)',
|
|
140
|
+
description: 'Runs the statement exactly as `POST /api/admin/telemetry/query` does (same guard, same ' +
|
|
141
|
+
'timeout, row cap = `telemetry.query.maxRows`) and returns the result as an attachment: ' +
|
|
142
|
+
'`csv` (RFC 4180, UTF-8 with BOM; text cells that a spreadsheet would read as a formula ' +
|
|
143
|
+
'are prefixed with `\'`), `ndjson` (one object per row; a repeated column name gets `_2`, ' +
|
|
144
|
+
'`_3`), `xlsx` (one sheet, `results`) or `parquet`. `X-Telemetry-Row-Count` and ' +
|
|
145
|
+
'`X-Telemetry-Truncated` report the row count and whether the cap cut the result short. ' +
|
|
146
|
+
'Audited as `telemetry:export`.\n\n' +
|
|
147
|
+
ERROR_REASONS_DOC +
|
|
148
|
+
QUERY_REASONS_DOC,
|
|
149
|
+
}),
|
|
150
|
+
(0, swagger_1.ApiProduces)(...Object.values(telemetry_export_service_1.TELEMETRY_EXPORT_CONTENT_TYPES).map((type) => type.split(';')[0])),
|
|
151
|
+
(0, swagger_1.ApiResponse)({
|
|
152
|
+
status: 200,
|
|
153
|
+
description: 'The exported file',
|
|
154
|
+
headers: {
|
|
155
|
+
'Content-Disposition': {
|
|
156
|
+
description: '`attachment; filename="telemetry-<yyyyMMdd-HHmmss>.<format>"`',
|
|
157
|
+
schema: { type: 'string' },
|
|
158
|
+
},
|
|
159
|
+
'X-Telemetry-Row-Count': { description: 'Rows in the file.', schema: { type: 'integer' } },
|
|
160
|
+
'X-Telemetry-Truncated': {
|
|
161
|
+
description: '`true` when more rows matched than the row cap allowed.',
|
|
162
|
+
schema: { type: 'string', enum: ['true', 'false'] },
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
content: Object.fromEntries(Object.values(telemetry_export_service_1.TELEMETRY_EXPORT_CONTENT_TYPES).map((type) => [
|
|
166
|
+
type.split(';')[0],
|
|
167
|
+
{ schema: { type: 'string', format: 'binary' } },
|
|
168
|
+
])),
|
|
169
|
+
}),
|
|
170
|
+
(0, swagger_1.ApiResponse)({ status: 400, description: 'Validation error, refused or failed statement', type: index_1.ErrorDto }),
|
|
171
|
+
(0, swagger_1.ApiResponse)({ status: 409, description: 'Telemetry is disabled', type: index_1.ErrorDto }),
|
|
172
|
+
(0, swagger_1.ApiResponse)({ status: 503, description: 'No telemetry store, or it did not answer', type: index_1.ErrorDto }),
|
|
173
|
+
(0, swagger_1.ApiResponse)({ status: 504, description: 'The statement timed out', type: index_1.ErrorDto }),
|
|
174
|
+
__param(0, (0, common_1.Body)()),
|
|
175
|
+
__param(1, ActorId()),
|
|
176
|
+
__param(2, (0, common_1.Res)()),
|
|
177
|
+
__metadata("design:type", Function),
|
|
178
|
+
__metadata("design:paramtypes", [telemetry_query_dto_1.TelemetryExportRequestDto, String, Object]),
|
|
179
|
+
__metadata("design:returntype", Promise)
|
|
180
|
+
], TelemetryExplorerController.prototype, "export", null);
|
|
181
|
+
TelemetryExplorerController = __decorate([
|
|
182
|
+
(0, swagger_1.ApiTags)('Telemetry'),
|
|
183
|
+
(0, common_1.Controller)('admin/telemetry'),
|
|
184
|
+
__param(0, (0, common_1.Inject)(telemetry_query_service_1.TelemetryQueryService)),
|
|
185
|
+
__param(1, (0, common_1.Inject)(telemetry_schema_service_1.TelemetrySchemaService)),
|
|
186
|
+
__param(2, (0, common_1.Inject)(telemetry_export_service_1.TelemetryExportService)),
|
|
187
|
+
__metadata("design:paramtypes", [telemetry_query_service_1.TelemetryQueryService,
|
|
188
|
+
telemetry_schema_service_1.TelemetrySchemaService,
|
|
189
|
+
telemetry_export_service_1.TelemetryExportService])
|
|
190
|
+
], TelemetryExplorerController);
|
|
191
|
+
return TelemetryExplorerController;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=telemetry-explorer.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-explorer.controller.js","sourceRoot":"","sources":["../../src/telemetry/telemetry-explorer.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import type { TelemetrySettings as SystemTelemetryValue } from '@marinoscar/platform-contract/telemetry';
|
|
3
|
+
import type { TelemetryConfigResponse, TelemetryPublicConfig, UpdateTelemetryConfigInput } from './dto/telemetry-config.dto';
|
|
4
|
+
import { GreptimeClient } from './greptime/greptime.client';
|
|
5
|
+
import { type TelemetryAppInfo, type TelemetryAuditSink, type TelemetryJobsPort, type TelemetrySettingsStore } from './ports';
|
|
6
|
+
/** How long a `getPolicy()` answer may be reused. */
|
|
7
|
+
export declare const TELEMETRY_POLICY_CACHE_MS = 5000;
|
|
8
|
+
/** How often every instance re-reads the policy and re-applies the gate. */
|
|
9
|
+
export declare const TELEMETRY_GATE_REFRESH_MS = 5000;
|
|
10
|
+
/** Audit `action` for a successful admin save. */
|
|
11
|
+
export declare const TELEMETRY_CONFIG_AUDIT_ACTION = "telemetry:config_update";
|
|
12
|
+
/**
|
|
13
|
+
* The `telemetry` namespace (one cached read, the admin replace) and the
|
|
14
|
+
* runtime export gate it drives. Exported by `TelemetryModule`.
|
|
15
|
+
*
|
|
16
|
+
* @stability experimental
|
|
17
|
+
*/
|
|
18
|
+
export declare class TelemetrySettingsService implements OnModuleInit, OnModuleDestroy {
|
|
19
|
+
private readonly audit;
|
|
20
|
+
private readonly systemSettings;
|
|
21
|
+
private readonly greptime;
|
|
22
|
+
private readonly jobs;
|
|
23
|
+
private readonly appInfo;
|
|
24
|
+
private readonly logger;
|
|
25
|
+
private cache;
|
|
26
|
+
private refreshTimer;
|
|
27
|
+
/** Whether the previous background refresh failed — so a long outage logs once, not every 5s. */
|
|
28
|
+
private refreshFailing;
|
|
29
|
+
constructor(audit: TelemetryAuditSink, systemSettings: TelemetrySettingsStore, greptime: GreptimeClient, jobs: TelemetryJobsPort, appInfo: TelemetryAppInfo);
|
|
30
|
+
/**
|
|
31
|
+
* Applies the gate once, then keeps it fresh. Detached and swallowed: boot
|
|
32
|
+
* must never wait on, or fail because of, a settings read.
|
|
33
|
+
*/
|
|
34
|
+
onModuleInit(): void;
|
|
35
|
+
/** Stops the gate refresh. */
|
|
36
|
+
onModuleDestroy(): void;
|
|
37
|
+
/**
|
|
38
|
+
* The current `telemetry` policy. `fresh: true` bypasses the cache — for a
|
|
39
|
+
* caller SHOWING the configuration, never for a hot path.
|
|
40
|
+
*/
|
|
41
|
+
getPolicy(opts?: {
|
|
42
|
+
fresh?: boolean;
|
|
43
|
+
}): Promise<SystemTelemetryValue>;
|
|
44
|
+
/** Drop the cached policy so the next read consults the row. */
|
|
45
|
+
invalidateCache(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Re-reads the policy and sets the export gate to
|
|
48
|
+
* `telemetry.enabled && GreptimeDB configured`, and the gate's instance id
|
|
49
|
+
* to `telemetry.instanceId ??` the app's slug. Never throws: on a failed read the
|
|
50
|
+
* gate keeps its last values (see the header).
|
|
51
|
+
*
|
|
52
|
+
* @returns the gate's state after the call.
|
|
53
|
+
*/
|
|
54
|
+
refreshGate(): Promise<boolean>;
|
|
55
|
+
/** `GET /api/admin/telemetry/config`. Read fresh, and never creates the settings row. */
|
|
56
|
+
describeForAdmin(): Promise<TelemetryConfigResponse>;
|
|
57
|
+
/** `GET /api/telemetry/config` — the web feature flag. Cached; no provenance, no bounds. */
|
|
58
|
+
describePublic(): Promise<TelemetryPublicConfig>;
|
|
59
|
+
/**
|
|
60
|
+
* `PUT /api/admin/telemetry/config` — full replace of the namespace.
|
|
61
|
+
*
|
|
62
|
+
* Order, each step load-bearing:
|
|
63
|
+
* 1. `If-Match` refused BEFORE anything is written (409);
|
|
64
|
+
* 2. the settings write, passing `expectedVersion` again so the write
|
|
65
|
+
* re-checks it (that also writes the generic `system_settings:patch`
|
|
66
|
+
* audit row);
|
|
67
|
+
* 3. the cache dropped SYNCHRONOUSLY, before anything else awaits;
|
|
68
|
+
* 4. the `telemetry:config_update` audit row — changed field NAMES only;
|
|
69
|
+
* 5. the gate re-applied on this instance (others follow within
|
|
70
|
+
* `TELEMETRY_GATE_REFRESH_MS`);
|
|
71
|
+
* 6. a `telemetry.retention.apply` job enqueued, so a changed retention
|
|
72
|
+
* reaches GreptimeDB now rather than at the next 4am run. Never fails
|
|
73
|
+
* the save: the helper swallows its own errors, and the nightly cron
|
|
74
|
+
* re-asserts the TTL regardless.
|
|
75
|
+
*/
|
|
76
|
+
replace(input: UpdateTelemetryConfigInput, userId: string, expectedVersion?: number): Promise<TelemetryConfigResponse>;
|
|
77
|
+
/** The `global` settings row's provenance, WITHOUT creating it. */
|
|
78
|
+
private readRow;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The dotted NAMES of the fields that differ between two policies — never the
|
|
82
|
+
* values (the audit row's contract, the same as `ai_config:replace`).
|
|
83
|
+
*/
|
|
84
|
+
export declare function diffTelemetryFieldNames(before: SystemTelemetryValue, after: SystemTelemetryValue): string[];
|
|
85
|
+
//# sourceMappingURL=telemetry-settings.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-settings.service.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry-settings.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAEzG,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC5B,MAAM,SAAS,CAAC;AA0CjB,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AAEvE;;;;;GAKG;AACH,qBACa,wBAAyB,YAAW,YAAY,EAAE,eAAe;IAS5C,OAAO,CAAC,QAAQ,CAAC,KAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,cAAc;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IAEpE,OAAO,CAAC,KAAK,CAAgE;IAC7E,OAAO,CAAC,YAAY,CAA+B;IACnD,iGAAiG;IACjG,OAAO,CAAC,cAAc,CAAS;gBAGkB,KAAK,EAAE,kBAAkB,EACrB,cAAc,EAAE,sBAAsB,EACxE,QAAQ,EAAE,cAAc,EACA,IAAI,EAAE,iBAAiB,EACnB,OAAO,EAAE,gBAAgB;IAGxE;;;OAGG;IACH,YAAY,IAAI,IAAI;IAUpB,8BAA8B;IAC9B,eAAe,IAAI,IAAI;IAOvB;;;OAGG;IACG,SAAS,CAAC,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAa9E,gEAAgE;IAChE,eAAe,IAAI,IAAI;IAIvB;;;;;;;OAOG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAqCrC,yFAAyF;IACnF,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAe1D,4FAA4F;IACtF,cAAc,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAUtD;;;;;;;;;;;;;;;;OAgBG;IACG,OAAO,CACX,KAAK,EAAE,0BAA0B,EACjC,MAAM,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,uBAAuB,CAAC;IAmDnC,mEAAmE;IACnE,OAAO,CAAC,OAAO;CAGhB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAmB3G"}
|
|
@@ -0,0 +1,278 @@
|
|
|
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 TelemetrySettingsService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TelemetrySettingsService = exports.TELEMETRY_CONFIG_AUDIT_ACTION = exports.TELEMETRY_GATE_REFRESH_MS = exports.TELEMETRY_POLICY_CACHE_MS = void 0;
|
|
17
|
+
exports.diffTelemetryFieldNames = diffTelemetryFieldNames;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const index_1 = require("../otel-core/index");
|
|
20
|
+
const greptime_client_1 = require("./greptime/greptime.client");
|
|
21
|
+
const telemetry_retention_handler_1 = require("./handlers/telemetry-retention.handler");
|
|
22
|
+
const ports_1 = require("./ports");
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// TelemetrySettingsService — the `telemetry` namespace, and the runtime gate
|
|
25
|
+
// (issue #534, epic #528)
|
|
26
|
+
// =============================================================================
|
|
27
|
+
//
|
|
28
|
+
// Three jobs, one owner:
|
|
29
|
+
//
|
|
30
|
+
// 1. THE ONE CACHED READ of `telemetry.*` (`getPolicy`, 5s TTL — the same
|
|
31
|
+
// bound `AiConfigService` uses). The explorer (#535) and the assistant
|
|
32
|
+
// (#536) read their bounds (`query.maxRows`, `query.timeoutSeconds`,
|
|
33
|
+
// `assistant.*`) through this, not through `SystemSettingsService`.
|
|
34
|
+
//
|
|
35
|
+
// 2. THE ADMIN WRITE (`replace`), modelled on `AiConfigAdminService.replace`:
|
|
36
|
+
// If-Match checked before anything is written, `patchSettings` (which
|
|
37
|
+
// re-checks it), cache dropped synchronously, audit row with changed
|
|
38
|
+
// field NAMES, then the two side effects — the gate, and the retention
|
|
39
|
+
// job.
|
|
40
|
+
//
|
|
41
|
+
// 3. THE EXPORT GATE. `telemetryGate` (common/otel/telemetry-gate.ts) starts
|
|
42
|
+
// CLOSED; this service opens it when `telemetry.enabled` is true AND a
|
|
43
|
+
// telemetry store is configured (the connection saved at
|
|
44
|
+
// /admin/settings/telemetry, else the `GREPTIME_*` deployment default —
|
|
45
|
+
// `TelemetryConnectionService`, #558), on boot and every
|
|
46
|
+
// `TELEMETRY_GATE_REFRESH_MS` after. The interval is what makes a
|
|
47
|
+
// multi-instance deployment converge: the instance that served the PUT
|
|
48
|
+
// flips its gate immediately, every other one within one interval.
|
|
49
|
+
// The same refresh pushes the resolved instance identifier
|
|
50
|
+
// (`telemetry.instanceId`, else the app's slug — #565) with
|
|
51
|
+
// `telemetryGate.setInstanceId()`, so a relabel converges the same way.
|
|
52
|
+
//
|
|
53
|
+
// WHY BOTH CONDITIONS FOR THE GATE: with no GreptimeDB there is nowhere for
|
|
54
|
+
// the collector to write. Exporting anyway would only fill the collector's
|
|
55
|
+
// retry queue and its logs.
|
|
56
|
+
//
|
|
57
|
+
// A FAILED SETTINGS READ LEAVES THE GATE AS IT IS. Flipping it closed on a
|
|
58
|
+
// database blip would drop telemetry exactly when an operator most needs it;
|
|
59
|
+
// flipping it open would ignore an administrator's "off". The last known
|
|
60
|
+
// answer stands until a read succeeds.
|
|
61
|
+
// =============================================================================
|
|
62
|
+
/** How long a `getPolicy()` answer may be reused. */
|
|
63
|
+
exports.TELEMETRY_POLICY_CACHE_MS = 5_000;
|
|
64
|
+
/** How often every instance re-reads the policy and re-applies the gate. */
|
|
65
|
+
exports.TELEMETRY_GATE_REFRESH_MS = 5_000;
|
|
66
|
+
/** Audit `action` for a successful admin save. */
|
|
67
|
+
exports.TELEMETRY_CONFIG_AUDIT_ACTION = 'telemetry:config_update';
|
|
68
|
+
/**
|
|
69
|
+
* The `telemetry` namespace (one cached read, the admin replace) and the
|
|
70
|
+
* runtime export gate it drives. Exported by `TelemetryModule`.
|
|
71
|
+
*
|
|
72
|
+
* @stability experimental
|
|
73
|
+
*/
|
|
74
|
+
let TelemetrySettingsService = TelemetrySettingsService_1 = class TelemetrySettingsService {
|
|
75
|
+
audit;
|
|
76
|
+
systemSettings;
|
|
77
|
+
greptime;
|
|
78
|
+
jobs;
|
|
79
|
+
appInfo;
|
|
80
|
+
logger = new common_1.Logger(TelemetrySettingsService_1.name);
|
|
81
|
+
cache = null;
|
|
82
|
+
refreshTimer = null;
|
|
83
|
+
/** Whether the previous background refresh failed — so a long outage logs once, not every 5s. */
|
|
84
|
+
refreshFailing = false;
|
|
85
|
+
constructor(audit, systemSettings, greptime, jobs, appInfo) {
|
|
86
|
+
this.audit = audit;
|
|
87
|
+
this.systemSettings = systemSettings;
|
|
88
|
+
this.greptime = greptime;
|
|
89
|
+
this.jobs = jobs;
|
|
90
|
+
this.appInfo = appInfo;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Applies the gate once, then keeps it fresh. Detached and swallowed: boot
|
|
94
|
+
* must never wait on, or fail because of, a settings read.
|
|
95
|
+
*/
|
|
96
|
+
onModuleInit() {
|
|
97
|
+
void this.refreshGate();
|
|
98
|
+
this.refreshTimer = setInterval(() => {
|
|
99
|
+
void this.refreshGate();
|
|
100
|
+
}, exports.TELEMETRY_GATE_REFRESH_MS);
|
|
101
|
+
// Never the reason a process (or a test run) stays alive.
|
|
102
|
+
this.refreshTimer.unref?.();
|
|
103
|
+
}
|
|
104
|
+
/** Stops the gate refresh. */
|
|
105
|
+
onModuleDestroy() {
|
|
106
|
+
if (this.refreshTimer) {
|
|
107
|
+
clearInterval(this.refreshTimer);
|
|
108
|
+
this.refreshTimer = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The current `telemetry` policy. `fresh: true` bypasses the cache — for a
|
|
113
|
+
* caller SHOWING the configuration, never for a hot path.
|
|
114
|
+
*/
|
|
115
|
+
async getPolicy(opts = {}) {
|
|
116
|
+
const now = Date.now();
|
|
117
|
+
if (!opts.fresh && this.cache && now - this.cache.readAt < exports.TELEMETRY_POLICY_CACHE_MS) {
|
|
118
|
+
return this.cache.value;
|
|
119
|
+
}
|
|
120
|
+
const value = await this.systemSettings.getTelemetryPolicy();
|
|
121
|
+
this.cache = { value, readAt: Date.now() };
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
/** Drop the cached policy so the next read consults the row. */
|
|
125
|
+
invalidateCache() {
|
|
126
|
+
this.cache = null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Re-reads the policy and sets the export gate to
|
|
130
|
+
* `telemetry.enabled && GreptimeDB configured`, and the gate's instance id
|
|
131
|
+
* to `telemetry.instanceId ??` the app's slug. Never throws: on a failed read the
|
|
132
|
+
* gate keeps its last values (see the header).
|
|
133
|
+
*
|
|
134
|
+
* @returns the gate's state after the call.
|
|
135
|
+
*/
|
|
136
|
+
async refreshGate() {
|
|
137
|
+
try {
|
|
138
|
+
const policy = await this.getPolicy({ fresh: true });
|
|
139
|
+
const next = policy.enabled && this.greptime.isConfigured();
|
|
140
|
+
const previous = index_1.telemetryGate.isEnabled();
|
|
141
|
+
const nextInstanceId = (0, index_1.resolveTelemetryInstanceId)(policy.instanceId, this.appInfo.slug);
|
|
142
|
+
const previousInstanceId = index_1.telemetryGate.instanceId();
|
|
143
|
+
index_1.telemetryGate.setEnabled(next);
|
|
144
|
+
index_1.telemetryGate.setInstanceId(nextInstanceId);
|
|
145
|
+
if (next !== previous) {
|
|
146
|
+
this.logger.log(`Telemetry export ${next ? 'enabled' : 'disabled'}`);
|
|
147
|
+
}
|
|
148
|
+
if (nextInstanceId !== previousInstanceId) {
|
|
149
|
+
this.logger.log(`Telemetry instance id is now "${nextInstanceId}"`);
|
|
150
|
+
}
|
|
151
|
+
if (this.refreshFailing) {
|
|
152
|
+
this.refreshFailing = false;
|
|
153
|
+
this.logger.log('Telemetry settings readable again; export gate is current');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (!this.refreshFailing) {
|
|
158
|
+
this.refreshFailing = true;
|
|
159
|
+
this.logger.warn('Could not read the telemetry settings; the export gate keeps its last value ' +
|
|
160
|
+
`(${index_1.telemetryGate.isEnabled() ? 'open' : 'closed'}): ` +
|
|
161
|
+
`${error instanceof Error ? error.message : String(error)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return index_1.telemetryGate.isEnabled();
|
|
165
|
+
}
|
|
166
|
+
/** `GET /api/admin/telemetry/config`. Read fresh, and never creates the settings row. */
|
|
167
|
+
async describeForAdmin() {
|
|
168
|
+
const [policy, row] = await Promise.all([this.getPolicy({ fresh: true }), this.readRow()]);
|
|
169
|
+
return {
|
|
170
|
+
...structuredClone(policy),
|
|
171
|
+
available: this.greptime.isConfigured(),
|
|
172
|
+
retentionApplicable: this.greptime.isAdminConfigured(),
|
|
173
|
+
instanceIdDefault: this.appInfo.slug,
|
|
174
|
+
instanceIdEffective: (0, index_1.resolveTelemetryInstanceId)(policy.instanceId, this.appInfo.slug),
|
|
175
|
+
version: row?.version ?? 0,
|
|
176
|
+
updatedAt: row?.updatedAt.toISOString() ?? null,
|
|
177
|
+
updatedBy: row?.updatedBy ?? null,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/** `GET /api/telemetry/config` — the web feature flag. Cached; no provenance, no bounds. */
|
|
181
|
+
async describePublic() {
|
|
182
|
+
const policy = await this.getPolicy();
|
|
183
|
+
return {
|
|
184
|
+
available: this.greptime.isConfigured(),
|
|
185
|
+
enabled: policy.enabled,
|
|
186
|
+
assistantEnabled: policy.assistant.enabled,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* `PUT /api/admin/telemetry/config` — full replace of the namespace.
|
|
191
|
+
*
|
|
192
|
+
* Order, each step load-bearing:
|
|
193
|
+
* 1. `If-Match` refused BEFORE anything is written (409);
|
|
194
|
+
* 2. the settings write, passing `expectedVersion` again so the write
|
|
195
|
+
* re-checks it (that also writes the generic `system_settings:patch`
|
|
196
|
+
* audit row);
|
|
197
|
+
* 3. the cache dropped SYNCHRONOUSLY, before anything else awaits;
|
|
198
|
+
* 4. the `telemetry:config_update` audit row — changed field NAMES only;
|
|
199
|
+
* 5. the gate re-applied on this instance (others follow within
|
|
200
|
+
* `TELEMETRY_GATE_REFRESH_MS`);
|
|
201
|
+
* 6. a `telemetry.retention.apply` job enqueued, so a changed retention
|
|
202
|
+
* reaches GreptimeDB now rather than at the next 4am run. Never fails
|
|
203
|
+
* the save: the helper swallows its own errors, and the nightly cron
|
|
204
|
+
* re-asserts the TTL regardless.
|
|
205
|
+
*/
|
|
206
|
+
async replace(input, userId, expectedVersion) {
|
|
207
|
+
const row = await this.readRow();
|
|
208
|
+
const currentVersion = row?.version ?? 0;
|
|
209
|
+
if (expectedVersion !== undefined && currentVersion !== expectedVersion) {
|
|
210
|
+
throw new common_1.ConflictException(`Telemetry settings version mismatch. Expected ${expectedVersion}, found ${currentVersion}`);
|
|
211
|
+
}
|
|
212
|
+
const current = await this.systemSettings.getTelemetryPolicy();
|
|
213
|
+
// `instanceId` is the one optional field of the PUT body (see the DTO):
|
|
214
|
+
// absent keeps the stored value, so a client that predates it cannot
|
|
215
|
+
// reset it.
|
|
216
|
+
const next = structuredClone({
|
|
217
|
+
...input,
|
|
218
|
+
instanceId: input.instanceId !== undefined ? input.instanceId : current.instanceId,
|
|
219
|
+
});
|
|
220
|
+
await this.systemSettings.replaceTelemetryPolicy(next, userId, expectedVersion);
|
|
221
|
+
// Step 3 — nothing awaits between the write and this.
|
|
222
|
+
this.invalidateCache();
|
|
223
|
+
const changedFields = diffTelemetryFieldNames(current, next);
|
|
224
|
+
await this.audit.record({
|
|
225
|
+
actorUserId: userId,
|
|
226
|
+
action: exports.TELEMETRY_CONFIG_AUDIT_ACTION,
|
|
227
|
+
targetType: 'telemetry_config',
|
|
228
|
+
targetId: 'telemetry',
|
|
229
|
+
meta: { changedFields },
|
|
230
|
+
});
|
|
231
|
+
this.logger.log(`Telemetry configuration replaced by user ${userId} ` +
|
|
232
|
+
`(enabled=${next.enabled} retentionDays=${next.retentionDays} ` +
|
|
233
|
+
`changed=${changedFields.join(',') || '(none)'})`);
|
|
234
|
+
await this.refreshGate();
|
|
235
|
+
await this.jobs.enqueueHousekeepingJob({
|
|
236
|
+
logger: this.logger,
|
|
237
|
+
type: telemetry_retention_handler_1.TELEMETRY_RETENTION_TYPE,
|
|
238
|
+
what: 'telemetry retention',
|
|
239
|
+
});
|
|
240
|
+
return this.describeForAdmin();
|
|
241
|
+
}
|
|
242
|
+
/** The `global` settings row's provenance, WITHOUT creating it. */
|
|
243
|
+
readRow() {
|
|
244
|
+
return this.systemSettings.readPolicyProvenance();
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
exports.TelemetrySettingsService = TelemetrySettingsService;
|
|
248
|
+
exports.TelemetrySettingsService = TelemetrySettingsService = TelemetrySettingsService_1 = __decorate([
|
|
249
|
+
(0, common_1.Injectable)(),
|
|
250
|
+
__param(0, (0, common_1.Inject)(ports_1.TELEMETRY_AUDIT_SINK)),
|
|
251
|
+
__param(1, (0, common_1.Inject)(ports_1.TELEMETRY_SETTINGS_STORE)),
|
|
252
|
+
__param(3, (0, common_1.Inject)(ports_1.TELEMETRY_JOBS)),
|
|
253
|
+
__param(4, (0, common_1.Inject)(ports_1.TELEMETRY_APP_INFO)),
|
|
254
|
+
__metadata("design:paramtypes", [Object, Object, greptime_client_1.GreptimeClient, Object, Object])
|
|
255
|
+
], TelemetrySettingsService);
|
|
256
|
+
/**
|
|
257
|
+
* The dotted NAMES of the fields that differ between two policies — never the
|
|
258
|
+
* values (the audit row's contract, the same as `ai_config:replace`).
|
|
259
|
+
*/
|
|
260
|
+
function diffTelemetryFieldNames(before, after) {
|
|
261
|
+
const flat = (value) => ({
|
|
262
|
+
enabled: value.enabled,
|
|
263
|
+
retentionDays: value.retentionDays,
|
|
264
|
+
instanceId: value.instanceId,
|
|
265
|
+
'query.maxRows': value.query.maxRows,
|
|
266
|
+
'query.timeoutSeconds': value.query.timeoutSeconds,
|
|
267
|
+
'assistant.enabled': value.assistant.enabled,
|
|
268
|
+
'assistant.provider': value.assistant.provider,
|
|
269
|
+
'assistant.modelId': value.assistant.modelId,
|
|
270
|
+
'assistant.shareResults': value.assistant.shareResults,
|
|
271
|
+
'assistant.maxResultRowsToModel': value.assistant.maxResultRowsToModel,
|
|
272
|
+
'assistant.maxSteps': value.assistant.maxSteps,
|
|
273
|
+
});
|
|
274
|
+
const a = flat(before);
|
|
275
|
+
const b = flat(after);
|
|
276
|
+
return Object.keys(a).filter((key) => a[key] !== b[key]);
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=telemetry-settings.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-settings.service.js","sourceRoot":"","sources":["../../src/telemetry/telemetry-settings.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { TelemetryStatus, TelemetryTtl } from './dto/telemetry-status.dto';
|
|
2
|
+
import { GreptimeClient } from './greptime/greptime.client';
|
|
3
|
+
import { TelemetrySettingsService } from './telemetry-settings.service';
|
|
4
|
+
/** Per-statement ceiling for the status reads. A status page must not hang. */
|
|
5
|
+
export declare const TELEMETRY_STATUS_TIMEOUT_MS = 5000;
|
|
6
|
+
export declare class TelemetryStatusService {
|
|
7
|
+
private readonly greptime;
|
|
8
|
+
private readonly settings;
|
|
9
|
+
private readonly logger;
|
|
10
|
+
constructor(greptime: GreptimeClient, settings: TelemetrySettingsService);
|
|
11
|
+
getStatus(): Promise<TelemetryStatus>;
|
|
12
|
+
private readTtl;
|
|
13
|
+
private readTables;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The TTL out of a `SHOW CREATE DATABASE` statement, e.g.
|
|
17
|
+
* `CREATE DATABASE IF NOT EXISTS public\nWITH(\n ttl = '7days'\n)` →
|
|
18
|
+
* `{ raw: '7days', days: 7 }`. Null when the statement sets no TTL.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseTtlFromCreateDatabase(statement: string): TelemetryTtl | null;
|
|
21
|
+
/**
|
|
22
|
+
* GreptimeDB prints durations with Rust's `humantime` (`7days`, `30days`,
|
|
23
|
+
* `1month 13h 26m 24s`, `1year`). Its month is 30.44 days and its year 365.25
|
|
24
|
+
* days, which is why 31 days does not print as `31days`. Returns seconds, or
|
|
25
|
+
* null for `forever`/`instant`/anything unrecognised.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseHumantimeSeconds(value: string): number | null;
|
|
28
|
+
//# sourceMappingURL=telemetry-status.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-status.service.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry-status.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,cAAc,EAA4B,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAqBxE,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD,qBACa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAG/C,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,wBAAwB;IAG/C,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;YAuD7B,OAAO;YAmBP,UAAU;CAYzB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQjF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkClE"}
|