@smthrs/observability 0.35.0 → 1.0.0-rc.4
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 +56 -0
- package/LICENSE +1 -1
- package/README.md +84 -0
- package/dist/cjs/BrowserOtel.d.ts +37 -0
- package/dist/cjs/BrowserOtel.d.ts.map +1 -0
- package/dist/cjs/BrowserOtel.js +47 -0
- package/dist/cjs/BrowserOtel.js.map +7 -0
- package/dist/cjs/Endpoint.d.ts +70 -0
- package/dist/cjs/Endpoint.d.ts.map +1 -0
- package/dist/cjs/Endpoint.js +85 -0
- package/dist/cjs/Endpoint.js.map +7 -0
- package/dist/cjs/JournalLogger.d.ts +232 -0
- package/dist/cjs/JournalLogger.d.ts.map +1 -0
- package/dist/cjs/JournalLogger.js +388 -0
- package/dist/cjs/JournalLogger.js.map +7 -0
- package/dist/cjs/Logger.d.ts +55 -0
- package/dist/cjs/Logger.d.ts.map +1 -0
- package/dist/cjs/Logger.js +72 -0
- package/dist/cjs/Logger.js.map +7 -0
- package/dist/cjs/Metric.d.ts +67 -0
- package/dist/cjs/Metric.d.ts.map +1 -0
- package/dist/cjs/Metric.js +68 -0
- package/dist/cjs/Metric.js.map +7 -0
- package/dist/cjs/NodeOtel.d.ts +42 -0
- package/dist/cjs/NodeOtel.d.ts.map +1 -0
- package/dist/cjs/NodeOtel.js +78 -0
- package/dist/cjs/NodeOtel.js.map +7 -0
- package/dist/cjs/Otel.d.ts +62 -0
- package/dist/cjs/Otel.d.ts.map +1 -0
- package/dist/cjs/Otel.js +75 -0
- package/dist/cjs/Otel.js.map +7 -0
- package/dist/cjs/Otlp.d.ts +200 -0
- package/dist/cjs/Otlp.d.ts.map +1 -0
- package/dist/cjs/Otlp.js +235 -0
- package/dist/cjs/Otlp.js.map +7 -0
- package/dist/cjs/Resource.d.ts +162 -0
- package/dist/cjs/Resource.d.ts.map +1 -0
- package/dist/cjs/Resource.js +186 -0
- package/dist/cjs/Resource.js.map +7 -0
- package/dist/cjs/index.d.ts +61 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/schemaIssuePath.d.ts +31 -0
- package/dist/cjs/internal/schemaIssuePath.d.ts.map +1 -0
- package/dist/cjs/internal/schemaIssuePath.js +49 -0
- package/dist/cjs/internal/schemaIssuePath.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/BrowserOtel.d.ts +37 -0
- package/dist/esm/BrowserOtel.d.ts.map +1 -0
- package/dist/esm/BrowserOtel.js +24 -0
- package/dist/esm/BrowserOtel.js.map +1 -0
- package/dist/esm/Endpoint.d.ts +70 -0
- package/dist/esm/Endpoint.d.ts.map +1 -0
- package/dist/esm/Endpoint.js +110 -0
- package/dist/esm/Endpoint.js.map +1 -0
- package/dist/esm/JournalLogger.d.ts +232 -0
- package/dist/esm/JournalLogger.d.ts.map +1 -0
- package/dist/esm/JournalLogger.js +482 -0
- package/dist/esm/JournalLogger.js.map +1 -0
- package/dist/esm/Logger.d.ts +55 -0
- package/dist/esm/Logger.d.ts.map +1 -0
- package/dist/esm/Logger.js +60 -0
- package/dist/esm/Logger.js.map +1 -0
- package/dist/esm/Metric.d.ts +67 -0
- package/dist/esm/Metric.d.ts.map +1 -0
- package/dist/esm/Metric.js +80 -0
- package/dist/esm/Metric.js.map +1 -0
- package/dist/esm/NodeOtel.d.ts +42 -0
- package/dist/esm/NodeOtel.d.ts.map +1 -0
- package/dist/esm/NodeOtel.js +56 -0
- package/dist/esm/NodeOtel.js.map +1 -0
- package/dist/esm/Otel.d.ts +62 -0
- package/dist/esm/Otel.d.ts.map +1 -0
- package/dist/esm/Otel.js +51 -0
- package/dist/esm/Otel.js.map +1 -0
- package/dist/esm/Otlp.d.ts +200 -0
- package/dist/esm/Otlp.d.ts.map +1 -0
- package/dist/esm/Otlp.js +350 -0
- package/dist/esm/Otlp.js.map +1 -0
- package/dist/esm/Resource.d.ts +162 -0
- package/dist/esm/Resource.d.ts.map +1 -0
- package/dist/esm/Resource.js +237 -0
- package/dist/esm/Resource.js.map +1 -0
- package/dist/esm/index.d.ts +61 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +61 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/schemaIssuePath.d.ts +31 -0
- package/dist/esm/internal/schemaIssuePath.d.ts.map +1 -0
- package/dist/esm/internal/schemaIssuePath.js +59 -0
- package/dist/esm/internal/schemaIssuePath.js.map +1 -0
- package/docs/README.md +162 -0
- package/docs/api.md +768 -0
- package/docs/concepts/instrumentation-and-export.md +68 -0
- package/docs/concepts/layer-map.md +72 -0
- package/docs/concepts/validated-acquisition.md +105 -0
- package/docs/guides/export-to-a-collector.md +167 -0
- package/docs/guides/forward-logs-to-the-journal.md +226 -0
- package/docs/guides/install-a-logger.md +111 -0
- package/docs/guides/read-runtime-metrics.md +83 -0
- package/docs/guides/testing.md +134 -0
- package/docs/guides/wire-an-opentelemetry-sdk.md +220 -0
- package/docs/installation.md +98 -0
- package/docs/quickstart.md +145 -0
- package/docs/troubleshooting.md +168 -0
- package/package.json +221 -32
- package/src/BrowserOtel.ts +51 -0
- package/src/Endpoint.ts +131 -0
- package/src/JournalLogger.ts +596 -0
- package/src/Logger.ts +106 -0
- package/src/Metric.ts +88 -0
- package/src/NodeOtel.ts +90 -0
- package/src/Otel.ts +117 -0
- package/src/Otlp.ts +477 -0
- package/src/Resource.ts +324 -0
- package/src/index.ts +67 -0
- package/src/internal/schemaIssuePath.ts +65 -0
- package/docker-compose.otel.yml +0 -104
- package/grafana/dashboards/smithers-dashboard.json +0 -453
- package/grafana/provisioning/dashboards/dashboards.yml +0 -12
- package/grafana/provisioning/datasources/datasources.yml +0 -49
- package/loki/loki-config.yaml +0 -35
- package/otel-collector-config.yml +0 -38
- package/prometheus/prometheus.yml +0 -8
- package/src/MetricName.ts +0 -1
- package/src/MetricsServiceLive.js +0 -9
- package/src/README.md +0 -28
- package/src/ResolvedSmithersObservabilityOptions.ts +0 -12
- package/src/SmithersEvent.ts +0 -843
- package/src/SmithersLogFormat.ts +0 -1
- package/src/SmithersMetricDefinition.ts +0 -15
- package/src/SmithersMetricType.ts +0 -1
- package/src/SmithersMetricUnit.ts +0 -1
- package/src/SmithersObservability.js +0 -15
- package/src/SmithersObservabilityOptions.ts +0 -12
- package/src/SmithersObservabilityService.ts +0 -13
- package/src/_coreCorrelation/CorrelationContext.ts +0 -10
- package/src/_coreCorrelation/CorrelationContextLive.js +0 -11
- package/src/_coreCorrelation/CorrelationContextService.js +0 -15
- package/src/_coreCorrelation/CorrelationContextServiceShape.ts +0 -12
- package/src/_coreCorrelation/CorrelationPatch.ts +0 -3
- package/src/_coreCorrelation/README.md +0 -20
- package/src/_coreCorrelation/_correlationStorage.js +0 -4
- package/src/_coreCorrelation/correlationContextFiberRef.js +0 -5
- package/src/_coreCorrelation/correlationContextToLogAnnotations.js +0 -18
- package/src/_coreCorrelation/getCurrentCorrelationContext.js +0 -9
- package/src/_coreCorrelation/getCurrentCorrelationContextEffect.js +0 -11
- package/src/_coreCorrelation/index.js +0 -14
- package/src/_coreCorrelation/mergeCorrelationContext.js +0 -51
- package/src/_coreCorrelation/runWithCorrelationContext.js +0 -14
- package/src/_coreCorrelation/updateCurrentCorrelationContext.js +0 -17
- package/src/_coreCorrelation/withCorrelationContext.js +0 -38
- package/src/_coreCorrelation/withCurrentCorrelationContext.js +0 -11
- package/src/_coreMetrics.js +0 -14
- package/src/_coreMetricsShape.ts +0 -44
- package/src/_corePrometheus.js +0 -91
- package/src/_corePrometheusShape.ts +0 -11
- package/src/_coreTracing.js +0 -132
- package/src/_coreTracingShape.ts +0 -17
- package/src/_otelLogBuilders.js +0 -102
- package/src/_sessionFileResolvers.js +0 -164
- package/src/_smithersSpanAttributeAliases.js +0 -19
- package/src/_smithersTraceSpanStorage.js +0 -3
- package/src/_traceEventNormalizers.js +0 -499
- package/src/_traceRedaction.js +0 -162
- package/src/agentSessionEventToOtelLogRecord.js +0 -55
- package/src/agentTrace.ts +0 -144
- package/src/agentTraceCapabilities.js +0 -151
- package/src/annotateSmithersTrace.js +0 -11
- package/src/canonicalTraceEventToOtelLogRecord.js +0 -55
- package/src/correlation.js +0 -56
- package/src/createSmithersObservabilityLayer.js +0 -59
- package/src/createSmithersOtelLayer.js +0 -23
- package/src/createSmithersRuntimeLayer.js +0 -2
- package/src/detectAgentFamily.js +0 -26
- package/src/detectCaptureMode.js +0 -29
- package/src/emitOtelLogRecord.js +0 -19
- package/src/getCurrentSmithersTraceAnnotations.js +0 -14
- package/src/getCurrentSmithersTraceSpan.js +0 -7
- package/src/index.d.ts +0 -1392
- package/src/index.js +0 -137
- package/src/kindPhase.js +0 -17
- package/src/logging.js +0 -264
- package/src/makeSmithersSpanAttributes.js +0 -20
- package/src/metrics/README.md +0 -22
- package/src/metrics/SmithersMetricDefinition.ts +0 -17
- package/src/metrics/SmithersMetricType.ts +0 -1
- package/src/metrics/SmithersMetricUnit.ts +0 -1
- package/src/metrics/_asyncExternalWaitCounts.js +0 -4
- package/src/metrics/_buckets.js +0 -37
- package/src/metrics/_incrementGauge.js +0 -11
- package/src/metrics/_processStartMs.js +0 -1
- package/src/metrics/activeNodes.js +0 -2
- package/src/metrics/activeRuns.js +0 -2
- package/src/metrics/agentActionsTotal.js +0 -2
- package/src/metrics/agentDurationMs.js +0 -3
- package/src/metrics/agentErrorsTotal.js +0 -2
- package/src/metrics/agentEventsTotal.js +0 -2
- package/src/metrics/agentInvocationsTotal.js +0 -2
- package/src/metrics/agentRetriesTotal.js +0 -2
- package/src/metrics/agentSessionsTotal.js +0 -2
- package/src/metrics/agentTokensTotal.js +0 -2
- package/src/metrics/alertDeliveriesAttempted.js +0 -2
- package/src/metrics/alertDeliveriesSuppressed.js +0 -2
- package/src/metrics/alertsAcknowledgedTotal.js +0 -2
- package/src/metrics/alertsActive.js +0 -2
- package/src/metrics/alertsEscalatedTotal.js +0 -2
- package/src/metrics/alertsFiredTotal.js +0 -2
- package/src/metrics/alertsReopenedTotal.js +0 -2
- package/src/metrics/alertsResolvedTotal.js +0 -2
- package/src/metrics/alertsSilencedTotal.js +0 -2
- package/src/metrics/approvalPending.js +0 -2
- package/src/metrics/approvalWaitDuration.js +0 -5
- package/src/metrics/approvalsDenied.js +0 -2
- package/src/metrics/approvalsGranted.js +0 -2
- package/src/metrics/approvalsRequested.js +0 -2
- package/src/metrics/attemptDuration.js +0 -3
- package/src/metrics/attentionBacklog.js +0 -2
- package/src/metrics/cacheHits.js +0 -2
- package/src/metrics/cacheMisses.js +0 -2
- package/src/metrics/dbQueryDuration.js +0 -3
- package/src/metrics/dbRetries.js +0 -2
- package/src/metrics/dbTransactionDuration.js +0 -3
- package/src/metrics/dbTransactionRetries.js +0 -2
- package/src/metrics/dbTransactionRollbacks.js +0 -2
- package/src/metrics/devtoolsActiveSubscribers.js +0 -2
- package/src/metrics/devtoolsBackpressureDisconnectTotal.js +0 -2
- package/src/metrics/devtoolsDeltaBuildMs.js +0 -3
- package/src/metrics/devtoolsEventBytes.js +0 -3
- package/src/metrics/devtoolsEventTotal.js +0 -2
- package/src/metrics/devtoolsSnapshotBuildMs.js +0 -5
- package/src/metrics/devtoolsSubscribeTotal.js +0 -2
- package/src/metrics/errorsTotal.js +0 -2
- package/src/metrics/eventsEmittedTotal.js +0 -2
- package/src/metrics/externalWaitAsyncPending.js +0 -2
- package/src/metrics/gatewayApprovalDecisionsTotal.js +0 -2
- package/src/metrics/gatewayAuthEventsTotal.js +0 -2
- package/src/metrics/gatewayConnectionsActive.js +0 -2
- package/src/metrics/gatewayConnectionsClosedTotal.js +0 -2
- package/src/metrics/gatewayConnectionsTotal.js +0 -2
- package/src/metrics/gatewayCronTriggersTotal.js +0 -2
- package/src/metrics/gatewayErrorsTotal.js +0 -2
- package/src/metrics/gatewayHeartbeatTicksTotal.js +0 -2
- package/src/metrics/gatewayMessagesReceivedTotal.js +0 -2
- package/src/metrics/gatewayMessagesSentTotal.js +0 -2
- package/src/metrics/gatewayRpcCallsTotal.js +0 -2
- package/src/metrics/gatewayRpcDuration.js +0 -3
- package/src/metrics/gatewayRunEventBackpressureDisconnectTotal.js +0 -4
- package/src/metrics/gatewayRunsCompletedTotal.js +0 -2
- package/src/metrics/gatewayRunsStartedTotal.js +0 -2
- package/src/metrics/gatewaySignalsTotal.js +0 -2
- package/src/metrics/gatewayWebhooksReceivedTotal.js +0 -2
- package/src/metrics/gatewayWebhooksRejectedTotal.js +0 -2
- package/src/metrics/gatewayWebhooksVerifiedTotal.js +0 -2
- package/src/metrics/heartbeatDataSizeBytes.js +0 -5
- package/src/metrics/heartbeatIntervalMs.js +0 -3
- package/src/metrics/hotReloadDuration.js +0 -3
- package/src/metrics/hotReloadFailures.js +0 -2
- package/src/metrics/hotReloads.js +0 -2
- package/src/metrics/httpRequestDuration.js +0 -3
- package/src/metrics/httpRequests.js +0 -2
- package/src/metrics/index.d.ts +0 -1222
- package/src/metrics/index.js +0 -168
- package/src/metrics/memoryFactReads.js +0 -3
- package/src/metrics/memoryFactWrites.js +0 -3
- package/src/metrics/memoryMessageSaves.js +0 -3
- package/src/metrics/memoryRecallDuration.js +0 -11
- package/src/metrics/memoryRecallQueries.js +0 -3
- package/src/metrics/metricsServiceAdapter.js +0 -181
- package/src/metrics/nodeDuration.js +0 -3
- package/src/metrics/nodeRetriesTotal.js +0 -2
- package/src/metrics/nodesFailed.js +0 -2
- package/src/metrics/nodesFinished.js +0 -2
- package/src/metrics/nodesStarted.js +0 -2
- package/src/metrics/openApiToolCallErrorsTotal.js +0 -3
- package/src/metrics/openApiToolCallsTotal.js +0 -3
- package/src/metrics/openApiToolDuration.js +0 -9
- package/src/metrics/processHeapUsedBytes.js +0 -2
- package/src/metrics/processMemoryRssBytes.js +0 -2
- package/src/metrics/processUptimeSeconds.js +0 -2
- package/src/metrics/promptSizeBytes.js +0 -3
- package/src/metrics/replaysStarted.js +0 -3
- package/src/metrics/responseSizeBytes.js +0 -3
- package/src/metrics/rewindDurationMs.js +0 -3
- package/src/metrics/rewindFramesDeleted.js +0 -3
- package/src/metrics/rewindRollbackTotal.js +0 -2
- package/src/metrics/rewindSandboxesReverted.js +0 -3
- package/src/metrics/rewindTotal.js +0 -2
- package/src/metrics/runDuration.js +0 -3
- package/src/metrics/runForksCreated.js +0 -3
- package/src/metrics/runsAncestryDepth.js +0 -3
- package/src/metrics/runsCancelledTotal.js +0 -2
- package/src/metrics/runsCarriedStateBytes.js +0 -5
- package/src/metrics/runsContinuedTotal.js +0 -2
- package/src/metrics/runsFailedTotal.js +0 -2
- package/src/metrics/runsFinishedTotal.js +0 -2
- package/src/metrics/runsResumedTotal.js +0 -2
- package/src/metrics/runsTotal.js +0 -2
- package/src/metrics/sandboxActive.js +0 -2
- package/src/metrics/sandboxBundleSizeBytes.js +0 -5
- package/src/metrics/sandboxCompletedTotal.js +0 -2
- package/src/metrics/sandboxCreatedTotal.js +0 -2
- package/src/metrics/sandboxDurationMs.js +0 -3
- package/src/metrics/sandboxPatchCount.js +0 -3
- package/src/metrics/sandboxTransportDurationMs.js +0 -5
- package/src/metrics/schedulerConcurrencyUtilization.js +0 -2
- package/src/metrics/schedulerQueueDepth.js +0 -2
- package/src/metrics/schedulerWaitDuration.js +0 -5
- package/src/metrics/scorerDuration.js +0 -9
- package/src/metrics/scorerEventsFailed.js +0 -2
- package/src/metrics/scorerEventsFinished.js +0 -2
- package/src/metrics/scorerEventsStarted.js +0 -2
- package/src/metrics/scorersFailed.js +0 -3
- package/src/metrics/scorersFinished.js +0 -3
- package/src/metrics/scorersStarted.js +0 -3
- package/src/metrics/smithersMetricCatalog.js +0 -893
- package/src/metrics/smithersMetricCatalogByKey.js +0 -2
- package/src/metrics/smithersMetricCatalogByName.js +0 -2
- package/src/metrics/smithersMetricCatalogByPrometheusName.js +0 -4
- package/src/metrics/snapshotDuration.js +0 -9
- package/src/metrics/snapshotsCaptured.js +0 -3
- package/src/metrics/supervisorPollDuration.js +0 -5
- package/src/metrics/supervisorPollsTotal.js +0 -2
- package/src/metrics/supervisorResumeLag.js +0 -5
- package/src/metrics/supervisorResumedTotal.js +0 -2
- package/src/metrics/supervisorSkippedTotal.js +0 -2
- package/src/metrics/supervisorStaleDetected.js +0 -2
- package/src/metrics/taskHeartbeatTimeoutTotal.js +0 -2
- package/src/metrics/taskHeartbeatsTotal.js +0 -2
- package/src/metrics/timerDelayDuration.js +0 -3
- package/src/metrics/timersCancelled.js +0 -2
- package/src/metrics/timersCreated.js +0 -2
- package/src/metrics/timersFired.js +0 -2
- package/src/metrics/timersPending.js +0 -2
- package/src/metrics/toPrometheusMetricName.js +0 -8
- package/src/metrics/tokensCacheReadTotal.js +0 -2
- package/src/metrics/tokensCacheWriteTotal.js +0 -2
- package/src/metrics/tokensContextWindowBucketTotal.js +0 -2
- package/src/metrics/tokensContextWindowPerCall.js +0 -5
- package/src/metrics/tokensInputPerCall.js +0 -3
- package/src/metrics/tokensInputTotal.js +0 -2
- package/src/metrics/tokensOutputPerCall.js +0 -3
- package/src/metrics/tokensOutputTotal.js +0 -2
- package/src/metrics/tokensReasoningTotal.js +0 -2
- package/src/metrics/toolCallErrorsTotal.js +0 -2
- package/src/metrics/toolCallsTotal.js +0 -2
- package/src/metrics/toolDuration.js +0 -3
- package/src/metrics/toolOutputTruncatedTotal.js +0 -2
- package/src/metrics/trackEvent.js +0 -608
- package/src/metrics/updateAsyncExternalWaitPending.js +0 -18
- package/src/metrics/updateProcessMetrics.js +0 -20
- package/src/metrics/vcsDuration.js +0 -3
- package/src/normalizeStructuredEvent.js +0 -15
- package/src/prometheusContentType.js +0 -1
- package/src/renderPrometheusMetrics.js +0 -212
- package/src/resolveAgentTraceCapabilities.js +0 -59
- package/src/resolveSmithersObservabilityOptions.js +0 -109
- package/src/smithersMetrics.js +0 -2
- package/src/smithersSpanNames.js +0 -6
- package/src/unsupportedKindsForCapabilities.js +0 -32
- package/src/withSmithersSpan.js +0 -17
- package/tempo/tempo.yml +0 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JournalLogger.d.ts","sourceRoot":"","sources":["../../src/JournalLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAA;AAE5D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAKhD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAKvC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;;;;;;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,gCAOhD;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;EAGxB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;EAGvB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;EAG7B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;IAAkE,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAGzB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAuSnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,2BAA2B,EAAE,OAAO,CAAC,OAAO,CAsE/D,CAAA"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var JournalLogger_exports = {};
|
|
30
|
+
__export(JournalLogger_exports, {
|
|
31
|
+
InvalidJournalLoggerOptions: () => InvalidJournalLoggerOptions,
|
|
32
|
+
TelemetryCause: () => TelemetryCause,
|
|
33
|
+
TelemetryCauseReason: () => TelemetryCauseReason,
|
|
34
|
+
TelemetryDie: () => TelemetryDie,
|
|
35
|
+
TelemetryFail: () => TelemetryFail,
|
|
36
|
+
TelemetryInterrupt: () => TelemetryInterrupt,
|
|
37
|
+
TelemetryLog: () => TelemetryLog,
|
|
38
|
+
layerJournalForwarding: () => layerJournalForwarding,
|
|
39
|
+
maximumCapacity: () => maximumCapacity,
|
|
40
|
+
maximumSnapshotBytes: () => maximumSnapshotBytes,
|
|
41
|
+
maximumSnapshotDepth: () => maximumSnapshotDepth,
|
|
42
|
+
maximumSnapshotMembers: () => maximumSnapshotMembers,
|
|
43
|
+
truncatedMarker: () => truncatedMarker,
|
|
44
|
+
unrenderableMarker: () => unrenderableMarker
|
|
45
|
+
});
|
|
46
|
+
module.exports = __toCommonJS(JournalLogger_exports);
|
|
47
|
+
var Journal = __toESM(require("@smthrs/journal/Journal"), 1);
|
|
48
|
+
var JournalEvent = __toESM(require("@smthrs/journal/JournalEvent"), 1);
|
|
49
|
+
var Redaction = __toESM(require("@smthrs/journal/Redaction"), 1);
|
|
50
|
+
var Cause = __toESM(require("effect/Cause"), 1);
|
|
51
|
+
var Context = __toESM(require("effect/Context"), 1);
|
|
52
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
53
|
+
var Layer = __toESM(require("effect/Layer"), 1);
|
|
54
|
+
var Logger = __toESM(require("effect/Logger"), 1);
|
|
55
|
+
var EffectMetric = __toESM(require("effect/Metric"), 1);
|
|
56
|
+
var Option = __toESM(require("effect/Option"), 1);
|
|
57
|
+
var Queue = __toESM(require("effect/Queue"), 1);
|
|
58
|
+
var References = __toESM(require("effect/References"), 1);
|
|
59
|
+
var Schema = __toESM(require("effect/Schema"), 1);
|
|
60
|
+
var Tracer = __toESM(require("effect/Tracer"), 1);
|
|
61
|
+
var import_schemaIssuePath = require("./internal/schemaIssuePath.js");
|
|
62
|
+
var import_Metric = require("./Metric.js");
|
|
63
|
+
const maximumCapacity = 65536;
|
|
64
|
+
const maximumSnapshotBytes = 1024 * 1024;
|
|
65
|
+
const maximumSnapshotMembers = 4096;
|
|
66
|
+
const maximumSnapshotDepth = 64;
|
|
67
|
+
const unrenderableMarker = "[Unrenderable]";
|
|
68
|
+
const truncatedMarker = "[Truncated]";
|
|
69
|
+
class InvalidJournalLoggerOptions extends Schema.TaggedError()(
|
|
70
|
+
"@smthrs/observability/InvalidJournalLoggerOptions",
|
|
71
|
+
{
|
|
72
|
+
code: Schema.Literal("invalid_journal_logger_options"),
|
|
73
|
+
path: Schema.String,
|
|
74
|
+
message: Schema.String
|
|
75
|
+
}
|
|
76
|
+
) {
|
|
77
|
+
}
|
|
78
|
+
const TelemetryFail = Schema.Struct({
|
|
79
|
+
_tag: Schema.Literal("Fail"),
|
|
80
|
+
error: Schema.Unknown
|
|
81
|
+
});
|
|
82
|
+
const TelemetryDie = Schema.Struct({
|
|
83
|
+
_tag: Schema.Literal("Die"),
|
|
84
|
+
defect: Schema.Unknown
|
|
85
|
+
});
|
|
86
|
+
const TelemetryInterrupt = Schema.Struct({
|
|
87
|
+
_tag: Schema.Literal("Interrupt"),
|
|
88
|
+
fiberId: Schema.NullOr(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)))
|
|
89
|
+
});
|
|
90
|
+
const TelemetryCauseReason = Schema.Union([TelemetryFail, TelemetryDie, TelemetryInterrupt]);
|
|
91
|
+
const TelemetryCause = Schema.Struct({
|
|
92
|
+
version: Schema.Literal(1),
|
|
93
|
+
reasons: Schema.Array(TelemetryCauseReason)
|
|
94
|
+
});
|
|
95
|
+
const TelemetryLog = Schema.Struct({
|
|
96
|
+
version: Schema.Literal(1),
|
|
97
|
+
level: Schema.Literals(["All", "Fatal", "Error", "Warn", "Info", "Debug", "Trace", "None"]),
|
|
98
|
+
message: Schema.Unknown,
|
|
99
|
+
annotations: Schema.Record(Schema.String, Schema.Unknown),
|
|
100
|
+
cause: TelemetryCause,
|
|
101
|
+
fiberId: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
102
|
+
traceId: Schema.optionalKey(Schema.String),
|
|
103
|
+
spanId: Schema.optionalKey(Schema.String),
|
|
104
|
+
timestamp: Schema.String
|
|
105
|
+
});
|
|
106
|
+
const sourceId = "flows/observability/logger";
|
|
107
|
+
const encoder = new TextEncoder();
|
|
108
|
+
const OptionsSchema = Schema.Struct({
|
|
109
|
+
runId: JournalEvent.RunId,
|
|
110
|
+
capacity: Schema.optional(
|
|
111
|
+
Schema.Int.check(
|
|
112
|
+
Schema.isGreaterThanOrEqualTo(1),
|
|
113
|
+
Schema.isLessThanOrEqualTo(maximumCapacity)
|
|
114
|
+
)
|
|
115
|
+
),
|
|
116
|
+
minimumLogLevel: Schema.optional(
|
|
117
|
+
Schema.Literals(["All", "Fatal", "Error", "Warn", "Info", "Debug", "Trace", "None"])
|
|
118
|
+
),
|
|
119
|
+
mergeWithExisting: Schema.optional(Schema.Boolean)
|
|
120
|
+
});
|
|
121
|
+
const validateOptions = (options) => Schema.decodeUnknownEffect(OptionsSchema)(options).pipe(
|
|
122
|
+
Effect.mapError((cause) => {
|
|
123
|
+
const path = (0, import_schemaIssuePath.schemaIssuePath)(cause, "options");
|
|
124
|
+
return new InvalidJournalLoggerOptions({
|
|
125
|
+
code: "invalid_journal_logger_options",
|
|
126
|
+
path,
|
|
127
|
+
message: `journal logger ${path} is invalid`
|
|
128
|
+
});
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
const reserve = (budget, bytes) => {
|
|
132
|
+
if (bytes > budget.bytes) return false;
|
|
133
|
+
budget.bytes -= bytes;
|
|
134
|
+
return true;
|
|
135
|
+
};
|
|
136
|
+
const textBytes = (value) => encoder.encode(JSON.stringify(value)).byteLength;
|
|
137
|
+
const quoteBytes = 2;
|
|
138
|
+
const shortEscapes = /* @__PURE__ */ new Set([8, 9, 10, 12, 13]);
|
|
139
|
+
const unitBytes = (code) => {
|
|
140
|
+
if (code === 34 || code === 92) return 2;
|
|
141
|
+
if (code < 32) return shortEscapes.has(code) ? 2 : 6;
|
|
142
|
+
if (code < 128) return 1;
|
|
143
|
+
if (code < 2048) return 2;
|
|
144
|
+
return 3;
|
|
145
|
+
};
|
|
146
|
+
const isLowSurrogate = (code) => code >= 56320 && code <= 57343;
|
|
147
|
+
const boundedPrefix = (value, limit) => {
|
|
148
|
+
let bytes = 0;
|
|
149
|
+
let index = 0;
|
|
150
|
+
while (index < value.length) {
|
|
151
|
+
const code = value.charCodeAt(index);
|
|
152
|
+
let width = 1;
|
|
153
|
+
let cost;
|
|
154
|
+
if (code >= 55296 && code <= 56319 && isLowSurrogate(value.charCodeAt(index + 1))) {
|
|
155
|
+
width = 2;
|
|
156
|
+
cost = 4;
|
|
157
|
+
} else if (code >= 55296 && code <= 57343) {
|
|
158
|
+
cost = 6;
|
|
159
|
+
} else {
|
|
160
|
+
cost = unitBytes(code);
|
|
161
|
+
}
|
|
162
|
+
if (bytes + cost > limit) break;
|
|
163
|
+
bytes += cost;
|
|
164
|
+
index += width;
|
|
165
|
+
}
|
|
166
|
+
return { text: value.slice(0, index), bytes };
|
|
167
|
+
};
|
|
168
|
+
const boundedText = (value, budget) => {
|
|
169
|
+
if (value.length <= maximumSnapshotBytes && reserve(budget, textBytes(value))) return value;
|
|
170
|
+
const markerBytes = textBytes(truncatedMarker);
|
|
171
|
+
const prefix = boundedPrefix(value, Math.max(0, budget.bytes - markerBytes - quoteBytes));
|
|
172
|
+
budget.bytes = Math.max(0, budget.bytes - (prefix.bytes + quoteBytes) - markerBytes);
|
|
173
|
+
return `${prefix.text}${truncatedMarker}`;
|
|
174
|
+
};
|
|
175
|
+
const standardErrorKeys = ["name", "message", "stack", "cause"];
|
|
176
|
+
const snapshotValue = (value, budget, ancestors, depth = 0) => {
|
|
177
|
+
if (budget.bytes <= 0) return truncatedMarker;
|
|
178
|
+
if (depth > maximumSnapshotDepth) return Redaction.depthMarker;
|
|
179
|
+
if (typeof value === "string") return boundedText(value, budget);
|
|
180
|
+
if (typeof value === "number") {
|
|
181
|
+
const projected = Number.isFinite(value) ? value : String(value);
|
|
182
|
+
reserve(budget, String(projected).length);
|
|
183
|
+
return projected;
|
|
184
|
+
}
|
|
185
|
+
if (typeof value === "boolean" || value === null) {
|
|
186
|
+
reserve(budget, value === null ? 4 : value ? 4 : 5);
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
if (typeof value === "bigint") return boundedText(`${value}n`, budget);
|
|
190
|
+
if (value === void 0) return boundedText("[Undefined]", budget);
|
|
191
|
+
if (typeof value === "function") return boundedText(Redaction.functionMarker, budget);
|
|
192
|
+
if (typeof value === "symbol") return boundedText(Redaction.symbolMarker, budget);
|
|
193
|
+
try {
|
|
194
|
+
if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {
|
|
195
|
+
return boundedText(Redaction.binaryMarker, budget);
|
|
196
|
+
}
|
|
197
|
+
} catch {
|
|
198
|
+
return boundedText(unrenderableMarker, budget);
|
|
199
|
+
}
|
|
200
|
+
if (ancestors.has(value)) return boundedText("[Circular]", budget);
|
|
201
|
+
ancestors.add(value);
|
|
202
|
+
try {
|
|
203
|
+
if (value instanceof Date) {
|
|
204
|
+
try {
|
|
205
|
+
return boundedText(value.toISOString(), budget);
|
|
206
|
+
} catch {
|
|
207
|
+
return boundedText(unrenderableMarker, budget);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (value instanceof Error) {
|
|
211
|
+
const record2 = /* @__PURE__ */ Object.create(null);
|
|
212
|
+
for (const key of standardErrorKeys.slice(0, budget.members)) {
|
|
213
|
+
budget.members--;
|
|
214
|
+
try {
|
|
215
|
+
record2[key] = snapshotValue(value[key], budget, ancestors, depth + 1);
|
|
216
|
+
} catch {
|
|
217
|
+
record2[key] = unrenderableMarker;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
let names2;
|
|
221
|
+
try {
|
|
222
|
+
names2 = Object.getOwnPropertyNames(value).filter(
|
|
223
|
+
(key) => !standardErrorKeys.includes(key)
|
|
224
|
+
);
|
|
225
|
+
} catch {
|
|
226
|
+
return record2;
|
|
227
|
+
}
|
|
228
|
+
let projected = 0;
|
|
229
|
+
let collided = false;
|
|
230
|
+
for (; projected < names2.length && budget.members > 0; projected++) {
|
|
231
|
+
budget.members--;
|
|
232
|
+
const key = names2[projected];
|
|
233
|
+
const boundedKey = boundedText(key, budget);
|
|
234
|
+
if (Object.hasOwn(record2, boundedKey)) {
|
|
235
|
+
collided = true;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
239
|
+
record2[boundedKey] = descriptor !== void 0 && "value" in descriptor ? snapshotValue(descriptor.value, budget, ancestors, depth + 1) : unrenderableMarker;
|
|
240
|
+
}
|
|
241
|
+
if (collided || projected < names2.length) record2[truncatedMarker] = truncatedMarker;
|
|
242
|
+
return record2;
|
|
243
|
+
}
|
|
244
|
+
if (Array.isArray(value)) {
|
|
245
|
+
const output = [];
|
|
246
|
+
const length = value.length;
|
|
247
|
+
for (let index = 0; index < length && budget.members > 0; index++) {
|
|
248
|
+
budget.members--;
|
|
249
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
250
|
+
output.push(
|
|
251
|
+
descriptor === void 0 || !("value" in descriptor) ? unrenderableMarker : snapshotValue(descriptor.value, budget, ancestors, depth + 1)
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
if (output.length < length) output.push(truncatedMarker);
|
|
255
|
+
return output;
|
|
256
|
+
}
|
|
257
|
+
const record = /* @__PURE__ */ Object.create(null);
|
|
258
|
+
const names = Object.getOwnPropertyNames(value);
|
|
259
|
+
for (let index = 0; index < names.length && budget.members > 0; index++) {
|
|
260
|
+
budget.members--;
|
|
261
|
+
const key = names[index];
|
|
262
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
263
|
+
const boundedKey = boundedText(key, budget);
|
|
264
|
+
if (Object.hasOwn(record, boundedKey)) continue;
|
|
265
|
+
record[boundedKey] = descriptor !== void 0 && "value" in descriptor ? snapshotValue(descriptor.value, budget, ancestors, depth + 1) : unrenderableMarker;
|
|
266
|
+
}
|
|
267
|
+
if (Object.keys(record).length < names.length) record[truncatedMarker] = truncatedMarker;
|
|
268
|
+
return record;
|
|
269
|
+
} catch {
|
|
270
|
+
return boundedText(unrenderableMarker, budget);
|
|
271
|
+
} finally {
|
|
272
|
+
ancestors.delete(value);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
const snapshotCause = (cause, budget) => ({
|
|
276
|
+
version: 1,
|
|
277
|
+
reasons: cause.reasons.slice(0, maximumSnapshotMembers).map((reason) => {
|
|
278
|
+
switch (reason._tag) {
|
|
279
|
+
case "Fail":
|
|
280
|
+
return { _tag: "Fail", error: snapshotValue(reason.error, budget, /* @__PURE__ */ new WeakSet()) };
|
|
281
|
+
case "Die":
|
|
282
|
+
return { _tag: "Die", defect: snapshotValue(reason.defect, budget, /* @__PURE__ */ new WeakSet()) };
|
|
283
|
+
case "Interrupt":
|
|
284
|
+
return { _tag: "Interrupt", fiberId: reason.fiberId ?? null };
|
|
285
|
+
}
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
const isTelemetryLog = Schema.is(TelemetryLog);
|
|
289
|
+
const snapshotAnnotations = (value, budget) => {
|
|
290
|
+
const snapshot = snapshotValue(value, budget, /* @__PURE__ */ new WeakSet());
|
|
291
|
+
return typeof snapshot === "object" && snapshot !== null && !Array.isArray(snapshot) ? snapshot : { [truncatedMarker]: truncatedMarker };
|
|
292
|
+
};
|
|
293
|
+
const snapshotLog = (options) => {
|
|
294
|
+
const budget = {
|
|
295
|
+
bytes: maximumSnapshotBytes,
|
|
296
|
+
members: maximumSnapshotMembers
|
|
297
|
+
};
|
|
298
|
+
try {
|
|
299
|
+
const span = Option.getOrUndefined(Context.getOption(options.fiber.context, Tracer.ParentSpan));
|
|
300
|
+
const candidate = {
|
|
301
|
+
version: 1,
|
|
302
|
+
level: options.logLevel,
|
|
303
|
+
message: snapshotValue(options.message, budget, /* @__PURE__ */ new WeakSet()),
|
|
304
|
+
annotations: snapshotAnnotations(options.fiber.getRef(References.CurrentLogAnnotations), budget),
|
|
305
|
+
cause: snapshotCause(options.cause, budget),
|
|
306
|
+
fiberId: options.fiber.id,
|
|
307
|
+
...span === void 0 ? {} : { traceId: span.traceId, spanId: span.spanId },
|
|
308
|
+
timestamp: options.date.toISOString()
|
|
309
|
+
};
|
|
310
|
+
const redacted = Redaction.redact(candidate, { onTooDeep: "name" });
|
|
311
|
+
return encoder.encode(JSON.stringify(redacted)).byteLength <= maximumSnapshotBytes && isTelemetryLog(redacted) ? redacted : { ...candidate, message: truncatedMarker, annotations: {}, cause: { version: 1, reasons: [] } };
|
|
312
|
+
} catch {
|
|
313
|
+
return {
|
|
314
|
+
version: 1,
|
|
315
|
+
level: options.logLevel,
|
|
316
|
+
message: unrenderableMarker,
|
|
317
|
+
annotations: {},
|
|
318
|
+
cause: { version: 1, reasons: [] },
|
|
319
|
+
fiberId: options.fiber.id,
|
|
320
|
+
timestamp: options.date.toISOString()
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
const makeLog = (options, runId) => new JournalEvent.Input({
|
|
325
|
+
runId,
|
|
326
|
+
sourceId,
|
|
327
|
+
// The journal owns the durable per-run/source allocation. A local counter
|
|
328
|
+
// starts over when a layer is rebuilt and makes distinct records collide.
|
|
329
|
+
eventType: "telemetry.log",
|
|
330
|
+
payload: snapshotLog(options),
|
|
331
|
+
meta: {
|
|
332
|
+
version: 1,
|
|
333
|
+
source: "/observability"
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
const layerJournalForwarding = (options) => Layer.unwrap(
|
|
337
|
+
Effect.map(validateOptions(options), (configured) => Layer.merge(
|
|
338
|
+
Layer.effect(
|
|
339
|
+
Logger.CurrentLoggers,
|
|
340
|
+
Effect.gen(function* () {
|
|
341
|
+
const journal = yield* Journal.Journal;
|
|
342
|
+
const queue = yield* Queue.bounded(configured.capacity ?? 256);
|
|
343
|
+
const dropped = EffectMetric.update(import_Metric.droppedLogRecords, 1);
|
|
344
|
+
const forward = Effect.fn("JournalLogger.forward")(
|
|
345
|
+
(input) => journal.emitLossy(input).pipe(
|
|
346
|
+
Effect.tap((receipt) => receipt._tag === "Dropped" ? dropped : Effect.void),
|
|
347
|
+
Effect.catch(
|
|
348
|
+
() => dropped.pipe(
|
|
349
|
+
Effect.andThen(
|
|
350
|
+
Effect.annotateLogs(Effect.logWarning("A telemetry log record could not be forwarded"), {
|
|
351
|
+
runId: configured.runId,
|
|
352
|
+
code: "journal_forwarding_failed"
|
|
353
|
+
})
|
|
354
|
+
)
|
|
355
|
+
)
|
|
356
|
+
)
|
|
357
|
+
)
|
|
358
|
+
);
|
|
359
|
+
yield* Effect.forever(
|
|
360
|
+
Queue.take(queue).pipe(
|
|
361
|
+
Effect.flatMap(forward),
|
|
362
|
+
// A defect from a journal implementation would otherwise end
|
|
363
|
+
// this fiber for the rest of the run, silently, while the layer
|
|
364
|
+
// still looks installed. Interruption stays fatal.
|
|
365
|
+
Effect.catchCause(
|
|
366
|
+
(cause) => Cause.hasInterruptsOnly(cause) ? Effect.failCause(cause) : dropped.pipe(
|
|
367
|
+
Effect.andThen(
|
|
368
|
+
Effect.annotateLogs(
|
|
369
|
+
Effect.logWarning("The telemetry forwarding worker recovered from a defect"),
|
|
370
|
+
{ runId: configured.runId, code: "journal_forwarding_defect" }
|
|
371
|
+
)
|
|
372
|
+
)
|
|
373
|
+
)
|
|
374
|
+
)
|
|
375
|
+
)
|
|
376
|
+
).pipe(Effect.forkScoped);
|
|
377
|
+
const logger = Logger.make((logOptions) => {
|
|
378
|
+
const accepted = !Queue.isFullUnsafe(queue) && Queue.offerUnsafe(queue, makeLog(logOptions, configured.runId));
|
|
379
|
+
if (!accepted) import_Metric.droppedLogRecords.updateUnsafe(1, logOptions.fiber.context);
|
|
380
|
+
});
|
|
381
|
+
const current = yield* Effect.withFiber((fiber) => Effect.sync(() => fiber.getRef(Logger.CurrentLoggers)));
|
|
382
|
+
return new Set(configured.mergeWithExisting === true ? current : []).add(logger);
|
|
383
|
+
})
|
|
384
|
+
),
|
|
385
|
+
configured.minimumLogLevel === void 0 ? Layer.empty : Layer.succeed(References.MinimumLogLevel, configured.minimumLogLevel)
|
|
386
|
+
))
|
|
387
|
+
);
|
|
388
|
+
//# sourceMappingURL=JournalLogger.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/JournalLogger.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Non-blocking forwarding of bounded operational logs to the durable journal.\n *\n * @since 0.1.0\n */\n\nimport * as Journal from \"@smthrs/journal/Journal\"\nimport * as JournalEvent from \"@smthrs/journal/JournalEvent\"\nimport * as Redaction from \"@smthrs/journal/Redaction\"\nimport * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport type * as LogLevel from \"effect/LogLevel\"\nimport * as EffectMetric from \"effect/Metric\"\nimport * as Option from \"effect/Option\"\nimport * as Queue from \"effect/Queue\"\nimport * as References from \"effect/References\"\nimport * as Schema from \"effect/Schema\"\nimport * as Tracer from \"effect/Tracer\"\nimport { schemaIssuePath } from \"./internal/schemaIssuePath.ts\"\nimport { droppedLogRecords } from \"./Metric.ts\"\n\n/**\n * Largest queue accepted by the forwarding logger.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumCapacity = 65_536\n\n/**\n * Largest detached log payload admitted to the asynchronous queue.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotBytes = 1024 * 1024\n\n/**\n * Largest number of container members copied into one detached log payload.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotMembers = 4_096\n\n/**\n * Deepest container path copied into one detached log payload.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const maximumSnapshotDepth = 64\n\n/**\n * What a hostile or unreadable logged value becomes.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const unrenderableMarker = \"[Unrenderable]\"\n\n/**\n * What a value beyond a logger resource ceiling becomes.\n *\n * @category constants\n * @since 1.0.0-rc.0\n */\nexport const truncatedMarker = \"[Truncated]\"\n\n/**\n * Options for the journal forwarding logger.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options {\n /** The run every forwarded record is attributed to. */\n readonly runId: JournalEvent.RunId\n /** Queue depth, 1 through {@link maximumCapacity}. Defaults to 256. */\n readonly capacity?: number | undefined\n /**\n * Pins `References.MinimumLogLevel` for the whole application. Omitted, the\n * layer leaves that reference alone and Effect's own `Info` default applies.\n */\n readonly minimumLogLevel?: LogLevel.LogLevel | undefined\n /**\n * Keeps the ambient loggers alongside the forwarder. Defaults to `false`,\n * which replaces the ambient logger set.\n */\n readonly mergeWithExisting?: boolean | undefined\n}\n\n/**\n * A stable logger configuration refusal.\n *\n * @category errors\n * @since 1.0.0-rc.0\n */\nexport class InvalidJournalLoggerOptions extends Schema.TaggedError<InvalidJournalLoggerOptions>()(\n \"@smthrs/observability/InvalidJournalLoggerOptions\",\n {\n code: Schema.Literal(\"invalid_journal_logger_options\"),\n path: Schema.String,\n message: Schema.String\n }\n) {}\n\n/**\n * One typed failure retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryFail = Schema.Struct({\n _tag: Schema.Literal(\"Fail\"),\n error: Schema.Unknown\n})\n\n/**\n * One unexpected defect retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryDie = Schema.Struct({\n _tag: Schema.Literal(\"Die\"),\n defect: Schema.Unknown\n})\n\n/**\n * One interruption retained from an Effect cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryInterrupt = Schema.Struct({\n _tag: Schema.Literal(\"Interrupt\"),\n fiberId: Schema.NullOr(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)))\n})\n\n/**\n * One reason in a persisted telemetry cause.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryCauseReason = Schema.Union([TelemetryFail, TelemetryDie, TelemetryInterrupt])\n\n/**\n * One reason in a persisted telemetry cause.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryCauseReason = typeof TelemetryCauseReason.Type\n\n/**\n * A versioned structural Effect cause.\n *\n * Effect 4 stores composed failures as an ordered reason list. The projection\n * preserves that order and each fail, defect, or interrupt discriminator.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryCause = Schema.Struct({\n version: Schema.Literal(1),\n reasons: Schema.Array(TelemetryCauseReason)\n})\n\n/**\n * A versioned structural Effect cause.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryCause = typeof TelemetryCause.Type\n\n/**\n * Runtime schema for the operational log payload written to the journal.\n *\n * @category schemas\n * @since 1.0.0-rc.0\n */\nexport const TelemetryLog = Schema.Struct({\n version: Schema.Literal(1),\n level: Schema.Literals([\"All\", \"Fatal\", \"Error\", \"Warn\", \"Info\", \"Debug\", \"Trace\", \"None\"]),\n message: Schema.Unknown,\n annotations: Schema.Record(Schema.String, Schema.Unknown),\n cause: TelemetryCause,\n fiberId: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n traceId: Schema.optionalKey(Schema.String),\n spanId: Schema.optionalKey(Schema.String),\n timestamp: Schema.String\n})\n\n/**\n * Versioned operational log payload written to the journal.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type TelemetryLog = typeof TelemetryLog.Type\n\nconst sourceId = \"flows/observability/logger\" as JournalEvent.SourceId\nconst encoder = new TextEncoder()\n\nconst OptionsSchema = Schema.Struct({\n runId: JournalEvent.RunId,\n capacity: Schema.optional(\n Schema.Int.check(\n Schema.isGreaterThanOrEqualTo(1),\n Schema.isLessThanOrEqualTo(maximumCapacity)\n )\n ),\n minimumLogLevel: Schema.optional(\n Schema.Literals([\"All\", \"Fatal\", \"Error\", \"Warn\", \"Info\", \"Debug\", \"Trace\", \"None\"])\n ),\n mergeWithExisting: Schema.optional(Schema.Boolean)\n})\n\nconst validateOptions = (options: Options) =>\n Schema.decodeUnknownEffect(OptionsSchema)(options).pipe(\n Effect.mapError((cause) => {\n const path = schemaIssuePath(cause, \"options\")\n return new InvalidJournalLoggerOptions({\n code: \"invalid_journal_logger_options\",\n path,\n message: `journal logger ${path} is invalid`\n })\n })\n )\n\ninterface SnapshotBudget {\n bytes: number\n members: number\n}\n\nconst reserve = (budget: SnapshotBudget, bytes: number): boolean => {\n if (bytes > budget.bytes) return false\n budget.bytes -= bytes\n return true\n}\n\nconst textBytes = (value: string): number => encoder.encode(JSON.stringify(value)).byteLength\n\nconst quoteBytes = 2\nconst shortEscapes = new Set([0x08, 0x09, 0x0a, 0x0c, 0x0d])\n\n/** Bytes one non-surrogate code unit occupies inside a JSON string body. */\nconst unitBytes = (code: number): number => {\n if (code === 0x22 || code === 0x5c) return 2\n if (code < 0x20) return shortEscapes.has(code) ? 2 : 6\n if (code < 0x80) return 1\n if (code < 0x800) return 2\n return 3\n}\n\nconst isLowSurrogate = (code: number): boolean => code >= 0xdc00 && code <= 0xdfff\n\n/**\n * The longest prefix whose JSON string body fits `limit` bytes, measured in one\n * forward pass. A surrogate pair is admitted or refused whole, so the retained\n * text is well formed whenever the input is.\n */\nconst boundedPrefix = (value: string, limit: number): { readonly text: string; readonly bytes: number } => {\n let bytes = 0\n let index = 0\n while (index < value.length) {\n const code = value.charCodeAt(index)\n let width = 1\n let cost: number\n if (code >= 0xd800 && code <= 0xdbff && isLowSurrogate(value.charCodeAt(index + 1))) {\n width = 2\n cost = 4\n } else if (code >= 0xd800 && code <= 0xdfff) {\n cost = 6\n } else {\n cost = unitBytes(code)\n }\n if (bytes + cost > limit) break\n bytes += cost\n index += width\n }\n return { text: value.slice(0, index), bytes }\n}\n\nconst boundedText = (value: string, budget: SnapshotBudget): string => {\n if (value.length <= maximumSnapshotBytes && reserve(budget, textBytes(value))) return value\n const markerBytes = textBytes(truncatedMarker)\n const prefix = boundedPrefix(value, Math.max(0, budget.bytes - markerBytes - quoteBytes))\n budget.bytes = Math.max(0, budget.bytes - (prefix.bytes + quoteBytes) - markerBytes)\n return `${prefix.text}${truncatedMarker}`\n}\n\n/**\n * Error fields read through the prototype chain, in the order the snapshot\n * projects them before any own data property the error added.\n */\nconst standardErrorKeys = [\"name\", \"message\", \"stack\", \"cause\"] as const\n\nconst snapshotValue = (\n value: unknown,\n budget: SnapshotBudget,\n ancestors: WeakSet<object>,\n depth = 0\n): unknown => {\n if (budget.bytes <= 0) return truncatedMarker\n if (depth > maximumSnapshotDepth) return Redaction.depthMarker\n if (typeof value === \"string\") return boundedText(value, budget)\n if (typeof value === \"number\") {\n const projected = Number.isFinite(value) ? value : String(value)\n reserve(budget, String(projected).length)\n return projected\n }\n if (typeof value === \"boolean\" || value === null) {\n reserve(budget, value === null ? 4 : value ? 4 : 5)\n return value\n }\n if (typeof value === \"bigint\") return boundedText(`${value}n`, budget)\n if (value === undefined) return boundedText(\"[Undefined]\", budget)\n if (typeof value === \"function\") return boundedText(Redaction.functionMarker, budget)\n if (typeof value === \"symbol\") return boundedText(Redaction.symbolMarker, budget)\n try {\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n return boundedText(Redaction.binaryMarker, budget)\n }\n } catch {\n return boundedText(unrenderableMarker, budget)\n }\n if (ancestors.has(value)) return boundedText(\"[Circular]\", budget)\n ancestors.add(value)\n try {\n if (value instanceof Date) {\n try {\n return boundedText(value.toISOString(), budget)\n } catch {\n return boundedText(unrenderableMarker, budget)\n }\n }\n if (value instanceof Error) {\n const record: Record<string, unknown> = Object.create(null)\n for (const key of standardErrorKeys.slice(0, budget.members)) {\n budget.members--\n try {\n record[key] = snapshotValue(value[key], budget, ancestors, depth + 1)\n } catch {\n record[key] = unrenderableMarker\n }\n }\n // Tagged failures (`_tag`, domain fields) and system errors (`code`,\n // `path`, `syscall`) keep their diagnostics as own data properties, so\n // the walk that projects plain records runs over the remaining keys.\n let names: ReadonlyArray<string>\n try {\n names = Object.getOwnPropertyNames(value).filter((key) =>\n !(standardErrorKeys as ReadonlyArray<string>).includes(key)\n )\n } catch {\n return record\n }\n let projected = 0\n let collided = false\n for (; projected < names.length && budget.members > 0; projected++) {\n budget.members--\n const key = names[projected]!\n const boundedKey = boundedText(key, budget)\n if (Object.hasOwn(record, boundedKey)) {\n collided = true\n continue\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n record[boundedKey] = descriptor !== undefined && \"value\" in descriptor\n ? snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n : unrenderableMarker\n }\n if (collided || projected < names.length) record[truncatedMarker] = truncatedMarker\n return record\n }\n if (Array.isArray(value)) {\n const output: Array<unknown> = []\n const length = value.length\n for (let index = 0; index < length && budget.members > 0; index++) {\n budget.members--\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index))\n output.push(\n descriptor === undefined || !(\"value\" in descriptor)\n ? unrenderableMarker\n : snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n )\n }\n if (output.length < length) output.push(truncatedMarker)\n return output\n }\n const record: Record<string, unknown> = Object.create(null)\n const names = Object.getOwnPropertyNames(value)\n for (let index = 0; index < names.length && budget.members > 0; index++) {\n budget.members--\n const key = names[index]!\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n const boundedKey = boundedText(key, budget)\n // A key truncated to fit the budget can read exactly like one already\n // copied. The first member keeps its slot; the later one is dropped and\n // the record is marked truncated below rather than silently overwritten.\n if (Object.hasOwn(record, boundedKey)) continue\n record[boundedKey] = descriptor !== undefined && \"value\" in descriptor\n ? snapshotValue(descriptor.value, budget, ancestors, depth + 1)\n : unrenderableMarker\n }\n if (Object.keys(record).length < names.length) record[truncatedMarker] = truncatedMarker\n return record\n } catch {\n return boundedText(unrenderableMarker, budget)\n } finally {\n ancestors.delete(value)\n }\n}\n\nconst snapshotCause = (cause: Cause.Cause<unknown>, budget: SnapshotBudget): TelemetryCause => ({\n version: 1,\n reasons: cause.reasons.slice(0, maximumSnapshotMembers).map((reason): TelemetryCauseReason => {\n switch (reason._tag) {\n case \"Fail\":\n return { _tag: \"Fail\", error: snapshotValue(reason.error, budget, new WeakSet()) }\n case \"Die\":\n return { _tag: \"Die\", defect: snapshotValue(reason.defect, budget, new WeakSet()) }\n case \"Interrupt\":\n return { _tag: \"Interrupt\", fiberId: reason.fiberId ?? null }\n }\n })\n})\n\nconst isTelemetryLog = Schema.is(TelemetryLog)\n\n/**\n * Annotations are a container in the durable schema, so a snapshot that spent\n * the budget names the loss inside a record instead of replacing the record\n * with a scalar the schema refuses.\n */\nconst snapshotAnnotations = (value: unknown, budget: SnapshotBudget): Readonly<Record<string, unknown>> => {\n const snapshot = snapshotValue(value, budget, new WeakSet())\n return typeof snapshot === \"object\" && snapshot !== null && !Array.isArray(snapshot)\n ? snapshot as Readonly<Record<string, unknown>>\n : { [truncatedMarker]: truncatedMarker }\n}\n\nconst snapshotLog = (options: Logger.Options<unknown>): TelemetryLog => {\n const budget: SnapshotBudget = {\n bytes: maximumSnapshotBytes,\n members: maximumSnapshotMembers\n }\n try {\n const span = Option.getOrUndefined(Context.getOption(options.fiber.context, Tracer.ParentSpan))\n const candidate: TelemetryLog = {\n version: 1,\n level: options.logLevel,\n message: snapshotValue(options.message, budget, new WeakSet()),\n annotations: snapshotAnnotations(options.fiber.getRef(References.CurrentLogAnnotations), budget),\n cause: snapshotCause(options.cause, budget),\n fiberId: options.fiber.id,\n ...(span === undefined ? {} : { traceId: span.traceId, spanId: span.spanId }),\n timestamp: options.date.toISOString()\n }\n const redacted = Redaction.redact(candidate, { onTooDeep: \"name\" }) as TelemetryLog\n // The durable row is only useful if the exported schema decodes it, so an\n // oversized or schema-invalid projection degrades to the total record\n // rather than to a payload every consumer throws on.\n return encoder.encode(JSON.stringify(redacted)).byteLength <= maximumSnapshotBytes && isTelemetryLog(redacted)\n ? redacted\n : { ...candidate, message: truncatedMarker, annotations: {}, cause: { version: 1, reasons: [] } }\n } catch {\n return {\n version: 1,\n level: options.logLevel,\n message: unrenderableMarker,\n annotations: {},\n cause: { version: 1, reasons: [] },\n fiberId: options.fiber.id,\n timestamp: options.date.toISOString()\n }\n }\n}\n\nconst makeLog = (options: Logger.Options<unknown>, runId: JournalEvent.RunId): JournalEvent.Input =>\n new JournalEvent.Input({\n runId,\n sourceId,\n // The journal owns the durable per-run/source allocation. A local counter\n // starts over when a layer is rebuilt and makes distinct records collide.\n eventType: \"telemetry.log\",\n payload: snapshotLog(options),\n meta: {\n version: 1,\n source: \"/observability\"\n }\n })\n\n/**\n * Installs a bounded, drop-on-overflow logger forwarder for one explicit run.\n *\n * Configuration is decoded before a worker starts. The callback reads the\n * queue's remaining room first, snapshots and redacts a bounded DTO\n * synchronously only when a slot is free, then performs only non-blocking\n * queue admission. A record a saturated queue cannot take is counted and\n * discarded without being snapshotted. Queue overflow, journal `Dropped` receipts, delivery failures,\n * and journal defects each advance `Metric.droppedLogRecords`. The two failure\n * paths also warn through the ambient loggers with a fixed code and run id,\n * and the worker keeps draining. `Accepted` and `Duplicate` do not advance the\n * counter. Admission receipts cannot identify later drop-oldest evictions of\n * these records or report asynchronous persistence failures or shutdown losses.\n * Closing the scope interrupts the worker and may drop records still queued\n * behind an in-flight write without advancing the counter.\n *\n * The layer replaces the ambient logger set unless `mergeWithExisting` is\n * `true`, and provides `MinimumLogLevel` only when `minimumLogLevel` is given,\n * so an application that set that reference elsewhere keeps it.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerJournalForwarding = (\n options: Options\n): Layer.Layer<never, InvalidJournalLoggerOptions, Journal.Journal> =>\n Layer.unwrap(\n Effect.map(validateOptions(options), (configured) =>\n Layer.merge(\n Layer.effect(\n Logger.CurrentLoggers,\n Effect.gen(function*() {\n const journal = yield* Journal.Journal\n const queue = yield* Queue.bounded<JournalEvent.Input>(configured.capacity ?? 256)\n const dropped = EffectMetric.update(droppedLogRecords, 1)\n // This worker is forked before the logger it feeds is installed, so\n // its ambient logger set cannot contain that logger and a warning\n // here cannot enqueue itself. Delivery stays lossy; the loss is\n // reported and counted instead of vanishing. Warning annotations\n // use fixed codes so ambient sinks never receive raw failures.\n const forward = Effect.fn(\"JournalLogger.forward\")((input: JournalEvent.Input) =>\n journal.emitLossy(input).pipe(\n Effect.tap((receipt) => receipt._tag === \"Dropped\" ? dropped : Effect.void),\n Effect.catch(() =>\n dropped.pipe(\n Effect.andThen(\n Effect.annotateLogs(Effect.logWarning(\"A telemetry log record could not be forwarded\"), {\n runId: configured.runId,\n code: \"journal_forwarding_failed\"\n })\n )\n )\n )\n )\n )\n yield* Effect.forever(\n Queue.take(queue).pipe(\n Effect.flatMap(forward),\n // A defect from a journal implementation would otherwise end\n // this fiber for the rest of the run, silently, while the layer\n // still looks installed. Interruption stays fatal.\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.failCause(cause)\n : dropped.pipe(\n Effect.andThen(\n Effect.annotateLogs(\n Effect.logWarning(\"The telemetry forwarding worker recovered from a defect\"),\n { runId: configured.runId, code: \"journal_forwarding_defect\" }\n )\n )\n )\n )\n )\n ).pipe(Effect.forkScoped)\n\n const logger = Logger.make<unknown, void>((logOptions) => {\n // Snapshotting and redacting the record is the expensive half of\n // admission, and saturation is exactly when that work is thrown\n // away, so a queue with no room refuses before the record is\n // built. Nothing else runs between this read and the offer, so\n // the check cannot refuse a record the queue would have taken,\n // and the offer still reports a queue that closed underneath it.\n const accepted = !Queue.isFullUnsafe(queue)\n && Queue.offerUnsafe(queue, makeLog(logOptions, configured.runId))\n if (!accepted) droppedLogRecords.updateUnsafe(1, logOptions.fiber.context)\n })\n const current = yield* Effect.withFiber((fiber) => Effect.sync(() => fiber.getRef(Logger.CurrentLoggers)))\n return new Set(configured.mergeWithExisting === true ? current : []).add(logger)\n })\n ),\n configured.minimumLogLevel === undefined\n ? Layer.empty\n : Layer.succeed(References.MinimumLogLevel, configured.minimumLogLevel)\n ))\n )\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["record", "names"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect logger layers used by flows.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.1.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import * as Logger from "effect/Logger";
|
|
8
|
+
import type * as LogLevel from "effect/LogLevel";
|
|
9
|
+
/**
|
|
10
|
+
* Options shared by the built-in logger layers.
|
|
11
|
+
*
|
|
12
|
+
* @category models
|
|
13
|
+
* @since 0.1.0
|
|
14
|
+
*/
|
|
15
|
+
export interface Options {
|
|
16
|
+
/**
|
|
17
|
+
* Pins `References.MinimumLogLevel` for the whole application. Omitted, the
|
|
18
|
+
* layer leaves that reference alone and Effect's own `Info` default applies.
|
|
19
|
+
*/
|
|
20
|
+
readonly minimumLogLevel?: LogLevel.LogLevel | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Keeps the ambient loggers alongside this one. Defaults to `false`, which
|
|
23
|
+
* replaces the ambient logger set, matching Effect's own `Logger.layer`.
|
|
24
|
+
*/
|
|
25
|
+
readonly mergeWithExisting?: boolean | undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Provides a human-readable development logger.
|
|
29
|
+
*
|
|
30
|
+
* @category layers
|
|
31
|
+
* @since 0.1.0
|
|
32
|
+
*/
|
|
33
|
+
export declare const layerPrettyDev: (options?: Options) => Layer.Layer<never>;
|
|
34
|
+
/**
|
|
35
|
+
* Provides one structured JSON object per log line.
|
|
36
|
+
*
|
|
37
|
+
* @category layers
|
|
38
|
+
* @since 0.1.0
|
|
39
|
+
*/
|
|
40
|
+
export declare const layerStructuredJson: (options?: Options) => Layer.Layer<never>;
|
|
41
|
+
/**
|
|
42
|
+
* Removes the active logger set while retaining Effect's minimum-level filter.
|
|
43
|
+
*
|
|
44
|
+
* @category layers
|
|
45
|
+
* @since 0.1.0
|
|
46
|
+
*/
|
|
47
|
+
export declare const layerNoop: (options?: Pick<Options, "minimumLogLevel">) => Layer.Layer<never>;
|
|
48
|
+
/**
|
|
49
|
+
* A logger layer that can be composed without requiring a runtime service.
|
|
50
|
+
*
|
|
51
|
+
* @category layers
|
|
52
|
+
* @since 0.1.0
|
|
53
|
+
*/
|
|
54
|
+
export declare const layer: (logger: Logger.Logger<unknown, unknown>, options?: Options) => Layer.Layer<never>;
|
|
55
|
+
//# sourceMappingURL=Logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAGhD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;AAuBD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAQnE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMxE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAIrF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAMnG,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var Logger_exports = {};
|
|
30
|
+
__export(Logger_exports, {
|
|
31
|
+
layer: () => layer,
|
|
32
|
+
layerNoop: () => layerNoop,
|
|
33
|
+
layerPrettyDev: () => layerPrettyDev,
|
|
34
|
+
layerStructuredJson: () => layerStructuredJson
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(Logger_exports);
|
|
37
|
+
var Layer = __toESM(require("effect/Layer"), 1);
|
|
38
|
+
var Logger = __toESM(require("effect/Logger"), 1);
|
|
39
|
+
var References = __toESM(require("effect/References"), 1);
|
|
40
|
+
const withMinimumLogLevel = (layer2, minimumLogLevel) => minimumLogLevel === void 0 ? layer2 : Layer.merge(layer2, Layer.succeed(References.MinimumLogLevel, minimumLogLevel));
|
|
41
|
+
const optionsWithDefaults = (options) => ({
|
|
42
|
+
minimumLogLevel: options?.minimumLogLevel,
|
|
43
|
+
mergeWithExisting: options?.mergeWithExisting ?? false
|
|
44
|
+
});
|
|
45
|
+
const layerPrettyDev = (options) => {
|
|
46
|
+
const resolved = optionsWithDefaults(options);
|
|
47
|
+
return withMinimumLogLevel(
|
|
48
|
+
Logger.layer([Logger.consolePretty({ colors: "auto", mode: "auto" })], {
|
|
49
|
+
mergeWithExisting: resolved.mergeWithExisting
|
|
50
|
+
}),
|
|
51
|
+
resolved.minimumLogLevel
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
const layerStructuredJson = (options) => {
|
|
55
|
+
const resolved = optionsWithDefaults(options);
|
|
56
|
+
return withMinimumLogLevel(
|
|
57
|
+
Logger.layer([Logger.consoleJson], { mergeWithExisting: resolved.mergeWithExisting }),
|
|
58
|
+
resolved.minimumLogLevel
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
const layerNoop = (options) => withMinimumLogLevel(
|
|
62
|
+
Logger.layer([]),
|
|
63
|
+
options?.minimumLogLevel ?? "None"
|
|
64
|
+
);
|
|
65
|
+
const layer = (logger, options) => {
|
|
66
|
+
const resolved = optionsWithDefaults(options);
|
|
67
|
+
return withMinimumLogLevel(
|
|
68
|
+
Logger.layer([logger], { mergeWithExisting: resolved.mergeWithExisting }),
|
|
69
|
+
resolved.minimumLogLevel
|
|
70
|
+
);
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/Logger.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Effect logger layers used by flows.\n *\n * @since 0.1.0\n */\n\nimport * as Layer from \"effect/Layer\"\nimport * as Logger from \"effect/Logger\"\nimport type * as LogLevel from \"effect/LogLevel\"\nimport * as References from \"effect/References\"\n\n/**\n * Options shared by the built-in logger layers.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Options {\n /**\n * Pins `References.MinimumLogLevel` for the whole application. Omitted, the\n * layer leaves that reference alone and Effect's own `Info` default applies.\n */\n readonly minimumLogLevel?: LogLevel.LogLevel | undefined\n /**\n * Keeps the ambient loggers alongside this one. Defaults to `false`, which\n * replaces the ambient logger set, matching Effect's own `Logger.layer`.\n */\n readonly mergeWithExisting?: boolean | undefined\n}\n\n/**\n * Installs the minimum-level reference only when the caller named a level, so\n * a layer that adds a sink does not pin the level an application chose\n * elsewhere. Effect's own default for the reference is already `Info`.\n */\nconst withMinimumLogLevel = (\n layer: Layer.Layer<never>,\n minimumLogLevel: LogLevel.LogLevel | undefined\n): Layer.Layer<never> =>\n minimumLogLevel === undefined\n ? layer\n : Layer.merge(layer, Layer.succeed(References.MinimumLogLevel, minimumLogLevel))\n\nconst optionsWithDefaults = (options?: Options): {\n readonly minimumLogLevel: LogLevel.LogLevel | undefined\n readonly mergeWithExisting: boolean\n} => ({\n minimumLogLevel: options?.minimumLogLevel,\n mergeWithExisting: options?.mergeWithExisting ?? false\n})\n\n/**\n * Provides a human-readable development logger.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerPrettyDev = (options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([Logger.consolePretty({ colors: \"auto\", mode: \"auto\" })], {\n mergeWithExisting: resolved.mergeWithExisting\n }),\n resolved.minimumLogLevel\n )\n}\n\n/**\n * Provides one structured JSON object per log line.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerStructuredJson = (options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([Logger.consoleJson], { mergeWithExisting: resolved.mergeWithExisting }),\n resolved.minimumLogLevel\n )\n}\n\n/**\n * Removes the active logger set while retaining Effect's minimum-level filter.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerNoop = (options?: Pick<Options, \"minimumLogLevel\">): Layer.Layer<never> =>\n withMinimumLogLevel(\n Logger.layer([]),\n options?.minimumLogLevel ?? \"None\"\n )\n\n/**\n * A logger layer that can be composed without requiring a runtime service.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = (logger: Logger.Logger<unknown, unknown>, options?: Options): Layer.Layer<never> => {\n const resolved = optionsWithDefaults(options)\n return withMinimumLogLevel(\n Logger.layer([logger], { mergeWithExisting: resolved.mergeWithExisting }),\n resolved.minimumLogLevel\n )\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,YAAuB;AACvB,aAAwB;AAExB,iBAA4B;AA0B5B,MAAM,sBAAsB,CAC1BA,QACA,oBAEA,oBAAoB,SAChBA,SACA,MAAM,MAAMA,QAAO,MAAM,QAAQ,WAAW,iBAAiB,eAAe,CAAC;AAEnF,MAAM,sBAAsB,CAAC,aAGvB;AAAA,EACJ,iBAAiB,SAAS;AAAA,EAC1B,mBAAmB,SAAS,qBAAqB;AACnD;AAQO,MAAM,iBAAiB,CAAC,YAA0C;AACvE,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,OAAO,cAAc,EAAE,QAAQ,QAAQ,MAAM,OAAO,CAAC,CAAC,GAAG;AAAA,MACrE,mBAAmB,SAAS;AAAA,IAC9B,CAAC;AAAA,IACD,SAAS;AAAA,EACX;AACF;AAQO,MAAM,sBAAsB,CAAC,YAA0C;AAC5E,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,OAAO,WAAW,GAAG,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACpF,SAAS;AAAA,EACX;AACF;AAQO,MAAM,YAAY,CAAC,YACxB;AAAA,EACE,OAAO,MAAM,CAAC,CAAC;AAAA,EACf,SAAS,mBAAmB;AAC9B;AAQK,MAAM,QAAQ,CAAC,QAAyC,YAA0C;AACvG,QAAM,WAAW,oBAAoB,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,MAAM,GAAG,EAAE,mBAAmB,SAAS,kBAAkB,CAAC;AAAA,IACxE,SAAS;AAAA,EACX;AACF;",
|
|
6
|
+
"names": ["layer"]
|
|
7
|
+
}
|