{"version":3,"file":"gce.js","sourceRoot":"","sources":["../../../src/detectors/gce.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH;;;GAGG;AAEH,4CAA0C;AAC1C,yCAAyC;AAEzC,MAAM,0BAA0B,GAAG,cAAc,CAAC;AAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAE3B,KAAK,UAAU,KAAK;IACzB,IAAI;QACF,MAAM,QAAQ,CAAC,QAAQ,CAAS,0BAA0B,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,GAAG,EAAE;QACZ,UAAI,CAAC,KAAK,CACR,0EAA0E,EAC1E,0BAA0B,EAC1B,GAAG,CACJ,CAAC;QACF,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAZD,sBAYC;AAED;;;GAGG;AACI,KAAK,UAAU,QAAQ;IAC5B,OAAO,QAAQ,CAAC,QAAQ,CAAS,0BAA0B,CAAC,CAAC;AAC/D,CAAC;AAFD,4BAEC;AAED;;;GAGG;AACI,KAAK,UAAU,MAAM;IAC1B,mFAAmF;IACnF,2FAA2F;IAC3F,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAkB,gBAAgB,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AALD,wBAKC;AAED;;;GAGG;AACI,KAAK,UAAU,QAAQ;IAC5B,OAAO,QAAQ,CAAC,QAAQ,CAAS,uBAAuB,CAAC,CAAC;AAC5D,CAAC;AAFD,4BAEC;AAED;;;GAGG;AACI,KAAK,UAAU,yBAAyB;IAI7C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAS,kBAAkB,CAAC,CAAC;IAErE,sBAAsB;IACtB,8FAA8F;IAC9F,MAAM,EAAE,GAAG,uDAAuD,CAAC;IACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;QACpB,MAAM,IAAI,KAAK,CACb,4FAA4F,QAAQ,EAAE,CACvG,CAAC;KACH;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAjBD,8DAiBC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Implementation in this file copied from\n * https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/v1.8.0/detectors/gcp/gce.go\n */\n\nimport { diag } from '@opentelemetry/api';\nimport * as metadata from 'gcp-metadata';\n\nconst MACHINE_TYPE_METADATA_ATTR = 'machine-type';\nconst ID_METADATA_ATTR = 'id';\nconst HOST_NAME_METADATA_ATTR = 'name';\nconst ZONE_METADATA_ATTR = 'zone';\n\nexport async function onGce(): Promise<boolean> {\n  try {\n    await metadata.instance<string>(MACHINE_TYPE_METADATA_ATTR);\n    return true;\n  } catch (err) {\n    diag.debug(\n      'Could not fetch metadata attribute %s, assuming not on GCE. Error was %s',\n      MACHINE_TYPE_METADATA_ATTR,\n      err\n    );\n    return false;\n  }\n}\n\n/**\n * The machine type of the instance on which this program is running. Check that {@link\n * onGce()} is true before calling this, or it may throw exceptions.\n */\nexport async function hostType(): Promise<string> {\n  return metadata.instance<string>(MACHINE_TYPE_METADATA_ATTR);\n}\n\n/**\n * The instance ID of the instance on which this program is running. Check that {@link onGce()}\n * is true before calling this, or it may throw exceptions.\n */\nexport async function hostId(): Promise<string> {\n  // May be a bignumber.js BigNumber which can just be converted with toString(). See\n  // https://github.com/googleapis/gcp-metadata#take-care-with-large-number-valued-properties\n  const id = await metadata.instance<number | object>(ID_METADATA_ATTR);\n  return id.toString();\n}\n\n/**\n * The instance ID of the instance on which this program is running. Check that {@link onGce()}\n * is true before calling this, or it may throw exceptions.\n */\nexport async function hostName(): Promise<string> {\n  return metadata.instance<string>(HOST_NAME_METADATA_ATTR);\n}\n\n/**\n * The zone and region in which this program is running. Check that {@link onGce()} is true\n * before calling this, or it may throw exceptions.\n */\nexport async function availabilityZoneAndRegion(): Promise<{\n  zone: string;\n  region: string;\n}> {\n  const fullZone = await metadata.instance<string>(ZONE_METADATA_ATTR);\n\n  // Format described in\n  // https://cloud.google.com/compute/docs/metadata/default-metadata-values#vm_instance_metadata\n  const re = /projects\\/\\d+\\/zones\\/(?<zone>(?<region>\\w+-\\w+)-\\w+)/;\n  const { zone, region } = fullZone.match(re)?.groups ?? {};\n  if (!zone || !region) {\n    throw new Error(\n      `zone was not in the expected format: projects/PROJECT_NUM/zones/COUNTRY-REGION-ZONE. Got ${fullZone}`\n    );\n  }\n\n  return { zone, region };\n}\n"]}