{"record":{"id":"fe4e011883208bd5","repo":"denoland/deno","slug":"only-valuetype-double-is-supported","errorCode":null,"errorMessage":"Only valueType: DOUBLE is supported","messagePattern":"Only valueType: DOUBLE is supported","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"ext/telemetry/telemetry.ts","lineNumber":822,"sourceCode":"  }\n}\n\nconst BATCH_CALLBACKS = new SafeMap<\n  BatchObservableCallback,\n  BatchObservableResult\n>();\nconst INDIVIDUAL_CALLBACKS = new SafeMap<Observable, Set<ObservableCallback>>();\n\nclass Meter {\n  #meter: OtelMeter;\n\n  constructor(meter: OtelMeter) {\n    this.#meter = meter;\n  }\n\n  createCounter(name: string, options?: MetricOptions): Counter {\n    if (options?.valueType !== undefined && options?.valueType !== 1) {\n      throw new Error(\"Only valueType: DOUBLE is supported\");\n    }\n    if (!METRICS_ENABLED) return new Counter(null, false);\n    const instrument = this.#meter.createCounter(\n      name,\n      // deno-lint-ignore deno-internal/prefer-primordials\n      options?.description,\n      options?.unit,\n    ) as Instrument;\n    return new Counter(instrument, false);\n  }\n\n  createUpDownCounter(name: string, options?: MetricOptions): Counter {\n    if (options?.valueType !== undefined && options?.valueType !== 1) {\n      throw new Error(\"Only valueType: DOUBLE is supported\");\n    }\n    if (!METRICS_ENABLED) return new Counter(null, true);\n    const instrument = this.#meter.createUpDownCounter(\n      name,","sourceCodeStart":804,"sourceCodeEnd":840,"githubUrl":"https://github.com/denoland/deno/blob/a961cdec3b1948844414ebeecc697dcad76df2d1/ext/telemetry/telemetry.ts#L804-L840","documentation":"Meter.createCounter() in Deno's OpenTelemetry shim (ext/telemetry/telemetry.ts:800) rejects options.valueType when present and not equal to 1. The file defines enum ValueType { INT = 0, DOUBLE = 1 }; only DOUBLE is supported because the OTLP exporter pipeline records all values as doubles. Passing ValueType.INT (0) or any other number throws before the instrument is created.","triggerScenarios":"meter.createCounter('hits', { valueType: ValueType.INT }); meter.createCounter('hits', { valueType: 0 }); reusing instrument options objects copied from an SDK-based app that used integer counters.","commonSituations":"Migrating metrics code from @opentelemetry/sdk-metrics where INT counters/gauges are valid; codegen that always emits valueType; using an enum imported from a mismatched OTel package version.","solutions":["Omit valueType from the options; it is optional and defaults to double behavior","If you must be explicit, use ValueType.DOUBLE (1)","Nothing else changes: JS numbers are recorded as doubles regardless, so integer counters can be replaced 1:1 by double counters"],"exampleFix":"// before\nconst counter = meter.createCounter('hits', { valueType: 0 }); // ValueType.INT\n\n// after\nconst counter = meter.createCounter('hits'); // or { valueType: 1 }","handlingStrategy":"validation","validationCode":"const opts = valueType === undefined || valueType === 1\n  ? { valueType }\n  : {}; // strip unsupported valueType before the call\nconst counter = meter.createCounter(\"hits\", opts);","typeGuard":"function supportsValueType(\n  o: { valueType?: number } | undefined,\n): boolean {\n  return o?.valueType === undefined || o?.valueType === 1;\n}","tryCatchPattern":"try {\n  counter = meter.createCounter(name, options);\n} catch (e) {\n  if (e instanceof Error && e.message === \"Only valueType: DOUBLE is supported\") {\n    counter = meter.createCounter(name); // retry without options\n  } else {\n    throw e;\n  }\n}","preventionTips":["Never set valueType; omit it unless you explicitly pass 1 (DOUBLE)","Centralize instrument creation in one factory so the rule is encoded once","When migrating from the OTel SDK, strip valueType: INT from every instrument config"],"tags":["opentelemetry","metrics","telemetry","enum","api-misuse"],"backgroundTag":"unsupported-enum-value","analyzedSha":"a961cdec3b1948844414ebeecc697dcad76df2d1","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}