{"version":3,"file":"otlp-grpc-configuration.js","sourceRoot":"","sources":["../../../src/configuration/otlp-grpc-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { OtlpSharedConfiguration } from '@opentelemetry/otlp-exporter-base';\nimport {\n  getSharedConfigurationDefaults,\n  mergeOtlpSharedConfigurationWithDefaults,\n} from '@opentelemetry/otlp-exporter-base';\nimport {\n  createEmptyMetadata,\n  createInsecureCredentials,\n  createSslCredentials,\n} from '../grpc-exporter-transport';\nimport { URL } from 'url';\nimport { diag } from '@opentelemetry/api';\n\n// NOTE: do not change this to be an actual import, doing so will break `@opentelemetry/instrumentation-grpc`\nimport type { ChannelCredentials, Metadata } from '@grpc/grpc-js';\n\nexport interface OtlpGrpcConfiguration extends OtlpSharedConfiguration {\n  url: string;\n  metadata: () => Metadata;\n  credentials: () => ChannelCredentials;\n  userAgent?: string;\n}\n\n/**\n * Unresolved configuration where parts of the config may depend on other config options being resolved first.\n */\nexport interface UnresolvedOtlpGrpcConfiguration\n  extends OtlpSharedConfiguration {\n  url: string;\n  metadata: () => Metadata;\n  /**\n   * Credentials are based on the final resolved URL\n   */\n  credentials: (url: string) => () => ChannelCredentials;\n}\n\nexport function validateAndNormalizeUrl(url: string): string {\n  url = url.trim();\n  const hasProtocol = url.match(/^([\\w]{1,8}):\\/\\//);\n  if (!hasProtocol) {\n    url = `https://${url}`;\n  }\n  const target = new URL(url);\n  if (target.protocol === 'unix:') {\n    return url;\n  }\n  if (target.pathname && target.pathname !== '/') {\n    diag.warn(\n      'URL path should not be set when using grpc, the path part of the URL will be ignored.'\n    );\n  }\n  if (target.protocol !== '' && !target.protocol?.match(/^(http)s?:$/)) {\n    diag.warn('URL protocol should be http(s)://. Using http://.');\n  }\n  return target.host;\n}\n\nfunction overrideMetadataEntriesIfNotPresent(\n  metadata: Metadata,\n  additionalMetadata: Metadata\n): void {\n  for (const [key, value] of Object.entries(additionalMetadata.getMap())) {\n    // only override with env var data if the key has no values.\n    // not using Metadata.merge() as it will keep both values.\n    if (metadata.get(key).length < 1) {\n      metadata.set(key, value);\n    }\n  }\n}\n\nexport function mergeOtlpGrpcConfigurationWithDefaults(\n  userProvidedConfiguration: Partial<OtlpGrpcConfiguration>,\n  fallbackConfiguration: Partial<UnresolvedOtlpGrpcConfiguration>,\n  defaultConfiguration: UnresolvedOtlpGrpcConfiguration\n): OtlpGrpcConfiguration {\n  const rawUrl =\n    userProvidedConfiguration.url ??\n    fallbackConfiguration.url ??\n    defaultConfiguration.url;\n\n  return {\n    ...mergeOtlpSharedConfigurationWithDefaults(\n      userProvidedConfiguration,\n      fallbackConfiguration,\n      defaultConfiguration\n    ),\n    metadata: () => {\n      const metadata = defaultConfiguration.metadata();\n      overrideMetadataEntriesIfNotPresent(\n        metadata,\n        // clone to ensure we don't modify what the user gave us in case they hold on to the returned reference\n        userProvidedConfiguration.metadata?.().clone() ?? createEmptyMetadata()\n      );\n      overrideMetadataEntriesIfNotPresent(\n        metadata,\n        fallbackConfiguration.metadata?.() ?? createEmptyMetadata()\n      );\n      return metadata;\n    },\n    url: validateAndNormalizeUrl(rawUrl),\n    credentials:\n      userProvidedConfiguration.credentials ??\n      fallbackConfiguration.credentials?.(rawUrl) ??\n      defaultConfiguration.credentials(rawUrl),\n    userAgent: userProvidedConfiguration.userAgent,\n  };\n}\n\nexport function getOtlpGrpcDefaultConfiguration(): UnresolvedOtlpGrpcConfiguration {\n  return {\n    ...getSharedConfigurationDefaults(),\n    metadata: () => createEmptyMetadata(),\n    url: 'http://localhost:4317',\n    credentials: (url: string) => {\n      if (url.startsWith('http://')) {\n        return () => createInsecureCredentials();\n      } else {\n        return () => createSslCredentials();\n      }\n    },\n  };\n}\n"]}