tracebeam-sdk 0.2.0 → 0.4.0

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/dist/index.d.mts CHANGED
@@ -1,5 +1,7 @@
1
- import { T as TraceBeamConfig } from './sdk-bh44OWR9.mjs';
2
- export { C as CaptureOptions, d as Event, e as EventBatch, E as EventLevel, c as Extra, b as Tags, a as TraceBeamSDK, g as TransportErrorResponse, h as TransportResponse, f as TransportSuccessResponse } from './sdk-bh44OWR9.mjs';
1
+ import { T as TraceBeamConfig } from './sdk-PSGN9S91.mjs';
2
+ export { C as CaptureOptions, d as Event, e as EventBatch, E as EventLevel, c as Extra, b as Tags, a as TraceBeamSDK, g as TransportErrorResponse, h as TransportResponse, f as TransportSuccessResponse } from './sdk-PSGN9S91.mjs';
3
+ import { MeterProvider, Histogram, Counter, UpDownCounter } from '@opentelemetry/api';
4
+ import '@opentelemetry/sdk-metrics';
3
5
 
4
6
  /**
5
7
  * Default configuration values
@@ -33,4 +35,37 @@ declare function mergeConfig(config: TraceBeamConfig): Required<TraceBeamConfig>
33
35
  */
34
36
  declare function validateConfig(config: TraceBeamConfig): void;
35
37
 
36
- export { ConfigError, DEFAULT_CONFIG, TraceBeamConfig, loadConfigFromEnv, mergeConfig, validateConfig };
38
+ /**
39
+ * HTTP metrics for request tracking
40
+ * All metrics are non-blocking and use OTLP semantic conventions
41
+ */
42
+ interface HttpMetrics {
43
+ /** Request duration histogram */
44
+ duration: Histogram;
45
+ /** Total request count */
46
+ requestCount: Counter;
47
+ /** Error count (5xx responses) */
48
+ errorCount: Counter;
49
+ /** Currently active requests */
50
+ activeRequests: UpDownCounter;
51
+ }
52
+ /**
53
+ * Create HTTP metrics instruments
54
+ */
55
+ declare function createHttpMetrics(meterProvider: MeterProvider, prefix?: string): HttpMetrics;
56
+ /**
57
+ * Common attributes for HTTP metrics
58
+ */
59
+ interface HttpMetricAttributes {
60
+ 'http.method': string;
61
+ 'http.route': string;
62
+ 'http.status_code': number;
63
+ 'http.scheme'?: string;
64
+ 'net.host.name'?: string;
65
+ }
66
+ /**
67
+ * Record HTTP request metrics (call at request end)
68
+ */
69
+ declare function recordHttpRequest(metrics: HttpMetrics, durationMs: number, attributes: HttpMetricAttributes): void;
70
+
71
+ export { ConfigError, DEFAULT_CONFIG, type HttpMetricAttributes, type HttpMetrics, TraceBeamConfig, createHttpMetrics, loadConfigFromEnv, mergeConfig, recordHttpRequest, validateConfig };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { T as TraceBeamConfig } from './sdk-bh44OWR9.js';
2
- export { C as CaptureOptions, d as Event, e as EventBatch, E as EventLevel, c as Extra, b as Tags, a as TraceBeamSDK, g as TransportErrorResponse, h as TransportResponse, f as TransportSuccessResponse } from './sdk-bh44OWR9.js';
1
+ import { T as TraceBeamConfig } from './sdk-PSGN9S91.js';
2
+ export { C as CaptureOptions, d as Event, e as EventBatch, E as EventLevel, c as Extra, b as Tags, a as TraceBeamSDK, g as TransportErrorResponse, h as TransportResponse, f as TransportSuccessResponse } from './sdk-PSGN9S91.js';
3
+ import { MeterProvider, Histogram, Counter, UpDownCounter } from '@opentelemetry/api';
4
+ import '@opentelemetry/sdk-metrics';
3
5
 
4
6
  /**
5
7
  * Default configuration values
@@ -33,4 +35,37 @@ declare function mergeConfig(config: TraceBeamConfig): Required<TraceBeamConfig>
33
35
  */
34
36
  declare function validateConfig(config: TraceBeamConfig): void;
35
37
 
36
- export { ConfigError, DEFAULT_CONFIG, TraceBeamConfig, loadConfigFromEnv, mergeConfig, validateConfig };
38
+ /**
39
+ * HTTP metrics for request tracking
40
+ * All metrics are non-blocking and use OTLP semantic conventions
41
+ */
42
+ interface HttpMetrics {
43
+ /** Request duration histogram */
44
+ duration: Histogram;
45
+ /** Total request count */
46
+ requestCount: Counter;
47
+ /** Error count (5xx responses) */
48
+ errorCount: Counter;
49
+ /** Currently active requests */
50
+ activeRequests: UpDownCounter;
51
+ }
52
+ /**
53
+ * Create HTTP metrics instruments
54
+ */
55
+ declare function createHttpMetrics(meterProvider: MeterProvider, prefix?: string): HttpMetrics;
56
+ /**
57
+ * Common attributes for HTTP metrics
58
+ */
59
+ interface HttpMetricAttributes {
60
+ 'http.method': string;
61
+ 'http.route': string;
62
+ 'http.status_code': number;
63
+ 'http.scheme'?: string;
64
+ 'net.host.name'?: string;
65
+ }
66
+ /**
67
+ * Record HTTP request metrics (call at request end)
68
+ */
69
+ declare function recordHttpRequest(metrics: HttpMetrics, durationMs: number, attributes: HttpMetricAttributes): void;
70
+
71
+ export { ConfigError, DEFAULT_CONFIG, type HttpMetricAttributes, type HttpMetrics, TraceBeamConfig, createHttpMetrics, loadConfigFromEnv, mergeConfig, recordHttpRequest, validateConfig };
package/dist/index.js CHANGED
@@ -33,8 +33,10 @@ __export(src_exports, {
33
33
  ConfigError: () => ConfigError,
34
34
  DEFAULT_CONFIG: () => DEFAULT_CONFIG,
35
35
  TraceBeamSDK: () => TraceBeamSDK,
36
+ createHttpMetrics: () => createHttpMetrics,
36
37
  loadConfigFromEnv: () => loadConfigFromEnv,
37
38
  mergeConfig: () => mergeConfig,
39
+ recordHttpRequest: () => recordHttpRequest,
38
40
  validateConfig: () => validateConfig
39
41
  });
40
42
  module.exports = __toCommonJS(src_exports);
@@ -473,6 +475,8 @@ var SimpleSpanProcessor = class {
473
475
  // src/sdk.ts
474
476
  var import_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
475
477
  var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
478
+ var import_sdk_metrics = require("@opentelemetry/sdk-metrics");
479
+ var import_exporter_metrics_otlp_http = require("@opentelemetry/exporter-metrics-otlp-http");
476
480
  var import_resources = require("@opentelemetry/resources");
477
481
  var import_semantic_conventions = require("@opentelemetry/semantic-conventions");
478
482
 
@@ -749,10 +753,135 @@ function parseBoolEnv(name, defaultValue) {
749
753
  return value.toLowerCase() === "true" || value === "1";
750
754
  }
751
755
 
756
+ // src/metrics/runtime.ts
757
+ function registerRuntimeMetrics(meterProvider) {
758
+ const meter = meterProvider.getMeter("tracebeam-runtime");
759
+ const memoryUsage = meter.createObservableGauge("process.runtime.nodejs.memory.heap_used", {
760
+ description: "Heap memory used in bytes",
761
+ unit: "By"
762
+ });
763
+ const memoryTotal = meter.createObservableGauge("process.runtime.nodejs.memory.heap_total", {
764
+ description: "Total heap memory in bytes",
765
+ unit: "By"
766
+ });
767
+ const memoryRss = meter.createObservableGauge("process.runtime.nodejs.memory.rss", {
768
+ description: "Resident set size in bytes",
769
+ unit: "By"
770
+ });
771
+ const memoryExternal = meter.createObservableGauge("process.runtime.nodejs.memory.external", {
772
+ description: "External memory in bytes",
773
+ unit: "By"
774
+ });
775
+ meter.addBatchObservableCallback(
776
+ (observableResult) => {
777
+ const mem = process.memoryUsage();
778
+ observableResult.observe(memoryUsage, mem.heapUsed);
779
+ observableResult.observe(memoryTotal, mem.heapTotal);
780
+ observableResult.observe(memoryRss, mem.rss);
781
+ observableResult.observe(memoryExternal, mem.external);
782
+ },
783
+ [memoryUsage, memoryTotal, memoryRss, memoryExternal]
784
+ );
785
+ const cpuUser = meter.createObservableGauge("process.runtime.nodejs.cpu.user", {
786
+ description: "CPU user time in microseconds",
787
+ unit: "us"
788
+ });
789
+ const cpuSystem = meter.createObservableGauge("process.runtime.nodejs.cpu.system", {
790
+ description: "CPU system time in microseconds",
791
+ unit: "us"
792
+ });
793
+ meter.addBatchObservableCallback(
794
+ (observableResult) => {
795
+ const cpu = process.cpuUsage();
796
+ observableResult.observe(cpuUser, cpu.user);
797
+ observableResult.observe(cpuSystem, cpu.system);
798
+ },
799
+ [cpuUser, cpuSystem]
800
+ );
801
+ const eventLoopLag = meter.createObservableGauge("process.runtime.nodejs.event_loop.lag", {
802
+ description: "Event loop lag in milliseconds",
803
+ unit: "ms"
804
+ });
805
+ let lastCheck = process.hrtime.bigint();
806
+ let currentLag = 0;
807
+ const measureLag = () => {
808
+ const now = process.hrtime.bigint();
809
+ const expected = 1000n;
810
+ const actual = Number(now - lastCheck) / 1e6;
811
+ currentLag = Math.max(0, actual - 1);
812
+ lastCheck = now;
813
+ setImmediate(measureLag);
814
+ };
815
+ setImmediate(measureLag);
816
+ eventLoopLag.addCallback((observableResult) => {
817
+ observableResult.observe(currentLag);
818
+ });
819
+ const activeHandles = meter.createObservableGauge("process.runtime.nodejs.active_handles", {
820
+ description: "Number of active handles",
821
+ unit: "{handles}"
822
+ });
823
+ const activeRequests = meter.createObservableGauge("process.runtime.nodejs.active_requests", {
824
+ description: "Number of active requests",
825
+ unit: "{requests}"
826
+ });
827
+ meter.addBatchObservableCallback(
828
+ (observableResult) => {
829
+ const handles = process._getActiveHandles?.()?.length ?? 0;
830
+ const requests = process._getActiveRequests?.()?.length ?? 0;
831
+ observableResult.observe(activeHandles, handles);
832
+ observableResult.observe(activeRequests, requests);
833
+ },
834
+ [activeHandles, activeRequests]
835
+ );
836
+ const uptime = meter.createObservableGauge("process.runtime.nodejs.uptime", {
837
+ description: "Process uptime in seconds",
838
+ unit: "s"
839
+ });
840
+ uptime.addCallback((observableResult) => {
841
+ observableResult.observe(process.uptime());
842
+ });
843
+ }
844
+
845
+ // src/metrics/http.ts
846
+ function createHttpMetrics(meterProvider, prefix = "http.server") {
847
+ const meter = meterProvider.getMeter("tracebeam-http");
848
+ return {
849
+ duration: meter.createHistogram(`${prefix}.request.duration`, {
850
+ description: "Duration of HTTP requests",
851
+ unit: "ms"
852
+ }),
853
+ requestCount: meter.createCounter(`${prefix}.request.count`, {
854
+ description: "Total number of HTTP requests",
855
+ unit: "{requests}"
856
+ }),
857
+ errorCount: meter.createCounter(`${prefix}.error.count`, {
858
+ description: "Total number of HTTP errors (5xx)",
859
+ unit: "{errors}"
860
+ }),
861
+ activeRequests: meter.createUpDownCounter(`${prefix}.active_requests`, {
862
+ description: "Number of active HTTP requests",
863
+ unit: "{requests}"
864
+ })
865
+ };
866
+ }
867
+ function recordHttpRequest(metrics3, durationMs, attributes) {
868
+ const labels = {
869
+ "http.method": attributes["http.method"],
870
+ "http.route": attributes["http.route"],
871
+ "http.status_code": String(attributes["http.status_code"])
872
+ };
873
+ metrics3.duration.record(durationMs, labels);
874
+ metrics3.requestCount.add(1, labels);
875
+ if (attributes["http.status_code"] >= 500) {
876
+ metrics3.errorCount.add(1, labels);
877
+ }
878
+ }
879
+
752
880
  // src/sdk.ts
753
881
  var TraceBeamSDK = class _TraceBeamSDK {
754
882
  config;
755
883
  provider;
884
+ meterProvider;
756
885
  tracer;
757
886
  isInitialized = true;
758
887
  globalTags = {};
@@ -765,39 +894,65 @@ var TraceBeamSDK = class _TraceBeamSDK {
765
894
  validateConfig(config);
766
895
  this.config = mergeConfig(config);
767
896
  const baseUrl = this.config.endpoint.replace(/\/$/, "");
768
- const exporterUrl = `${baseUrl}/v1/traces`;
769
- const exporter = new import_exporter_trace_otlp_http.OTLPTraceExporter({
770
- url: exporterUrl,
897
+ const traceExporterUrl = `${baseUrl}/v1/traces`;
898
+ const metricExporterUrl = `${baseUrl}/v1/metrics`;
899
+ const traceExporter = new import_exporter_trace_otlp_http.OTLPTraceExporter({
900
+ url: traceExporterUrl,
771
901
  headers: {
772
902
  "Authorization": `Bearer ${this.config.apiKey}`
773
903
  }
774
904
  });
775
905
  const spanProcessors = [];
776
- spanProcessors.push(new BatchSpanProcessor(exporter, {
906
+ spanProcessors.push(new BatchSpanProcessor(traceExporter, {
777
907
  maxExportBatchSize: this.config.batchSize,
778
908
  scheduledDelayMillis: this.config.flushInterval
779
909
  }));
780
910
  if (this.config.debug) {
781
911
  spanProcessors.push(new SimpleSpanProcessor(new ConsoleSpanExporter()));
782
- console.debug("[tracebeam] Initialized OTLP", {
783
- url: exporterUrl,
912
+ console.debug("[tracebeam] Initialized OTLP Traces", {
913
+ url: traceExporterUrl,
784
914
  projectId: this.config.projectId
785
915
  });
786
916
  }
917
+ const resource = (0, import_resources.resourceFromAttributes)({
918
+ [import_semantic_conventions.SemanticResourceAttributes.SERVICE_NAME]: this.config.projectId,
919
+ [import_semantic_conventions.SemanticResourceAttributes.SERVICE_VERSION]: this.config.environment,
920
+ [import_semantic_conventions.SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: this.config.environment,
921
+ "telemetry.sdk.language": "nodejs",
922
+ "telemetry.sdk.name": "tracebeam-sdk",
923
+ "telemetry.sdk.version": "0.2.1"
924
+ });
787
925
  this.provider = new import_sdk_trace_node.NodeTracerProvider({
788
- resource: (0, import_resources.resourceFromAttributes)({
789
- [import_semantic_conventions.SemanticResourceAttributes.SERVICE_NAME]: this.config.projectId,
790
- [import_semantic_conventions.SemanticResourceAttributes.SERVICE_VERSION]: this.config.environment,
791
- [import_semantic_conventions.SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: this.config.environment,
792
- "telemetry.sdk.language": "nodejs",
793
- "telemetry.sdk.name": "tracebeam-sdk",
794
- "telemetry.sdk.version": "0.2.0"
795
- }),
926
+ resource,
796
927
  spanProcessors
797
928
  });
798
929
  this.provider.register();
930
+ const metricExporter = new import_exporter_metrics_otlp_http.OTLPMetricExporter({
931
+ url: metricExporterUrl,
932
+ headers: {
933
+ "Authorization": `Bearer ${this.config.apiKey}`
934
+ }
935
+ });
936
+ this.meterProvider = new import_sdk_metrics.MeterProvider({
937
+ resource,
938
+ readers: [
939
+ new import_sdk_metrics.PeriodicExportingMetricReader({
940
+ exporter: metricExporter,
941
+ exportIntervalMillis: this.config.flushInterval
942
+ // Match config
943
+ })
944
+ ]
945
+ });
946
+ api.metrics.setGlobalMeterProvider(this.meterProvider);
947
+ registerRuntimeMetrics(this.meterProvider);
948
+ if (this.config.debug) {
949
+ console.debug("[tracebeam] Initialized OTLP Metrics with runtime metrics", {
950
+ url: metricExporterUrl
951
+ });
952
+ }
799
953
  registerInstrumentations({
800
954
  tracerProvider: this.provider,
955
+ meterProvider: this.meterProvider,
801
956
  instrumentations: [
802
957
  (0, import_auto_instrumentations_node.getNodeAutoInstrumentations)({
803
958
  // Disable some noisy instrumentations
@@ -812,6 +967,18 @@ var TraceBeamSDK = class _TraceBeamSDK {
812
967
  const config = loadConfigFromEnv();
813
968
  return new _TraceBeamSDK(config);
814
969
  }
970
+ /**
971
+ * Get the OpenTelemetry Meter for creating custom metrics
972
+ */
973
+ getMeter(name, version) {
974
+ return this.meterProvider.getMeter(name, version);
975
+ }
976
+ /**
977
+ * Get the MeterProvider for advanced metric creation
978
+ */
979
+ getMeterProvider() {
980
+ return this.meterProvider;
981
+ }
815
982
  /**
816
983
  * Capture an exception/error
817
984
  */
@@ -908,10 +1075,12 @@ var TraceBeamSDK = class _TraceBeamSDK {
908
1075
  }
909
1076
  async flush() {
910
1077
  await this.provider.forceFlush();
1078
+ await this.meterProvider.forceFlush();
911
1079
  }
912
1080
  async close() {
913
1081
  this.isInitialized = false;
914
1082
  await this.provider.shutdown();
1083
+ await this.meterProvider.shutdown();
915
1084
  }
916
1085
  isActive() {
917
1086
  return this.isInitialized;
@@ -931,8 +1100,10 @@ var TraceBeamSDK = class _TraceBeamSDK {
931
1100
  ConfigError,
932
1101
  DEFAULT_CONFIG,
933
1102
  TraceBeamSDK,
1103
+ createHttpMetrics,
934
1104
  loadConfigFromEnv,
935
1105
  mergeConfig,
1106
+ recordHttpRequest,
936
1107
  validateConfig
937
1108
  });
938
1109
  //# sourceMappingURL=index.js.map