{"record":{"id":"a701b69fc7bae625","repo":"hashicorp/nomad","slug":"empty-region-value","errorCode":null,"errorMessage":"empty region value","messagePattern":"empty region value","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"client/fingerprint/env_digitalocean.go","lineNumber":180,"sourceCode":"\t}\n\n\t// populate Links\n\tif id, ok := response.Attributes[\"unique.platform.digitalocean.id\"]; ok {\n\t\tresponse.AddLink(\"digitalocean\", id)\n\t}\n\n\tresponse.Detected = true\n\treturn nil\n}\n\nfunc (f *EnvDigitalOceanFingerprint) digitalOceanProbe() error {\n\tv, err := f.Get(\"region\", \"text\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif v = strings.TrimSpace(v); v == \"\" {\n\t\treturn errors.New(\"empty region value\")\n\t}\n\treturn nil\n}\n\n// Reload is a no-op but implements ReloadableFingerprint\nfunc (f *EnvDigitalOceanFingerprint) Reload() {}\n","sourceCodeStart":162,"sourceCodeEnd":187,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/client/fingerprint/env_digitalocean.go#L162-L187","documentation":"The DigitalOcean environment fingerprint fetches the region attribute from the DigitalOcean metadata service to confirm the node runs in DigitalOcean. digitalOceanProbe rejects the value when it is missing or whitespace-only, because a real DigitalOcean droplet always reports a region slug (e.g. nyc1).","triggerScenarios":"Fingerprinting a Nomad client where the DigitalOcean metadata endpoint answered but the region field was empty or absent — typically on non-DigitalOcean hosts where something intercepts the metadata request, or truncated/partial responses.","commonSituations":"Migrated Nomad clients that previously ran on DigitalOcean but now run elsewhere with stale metadata interception, proxies returning empty region fields, or DNS/hosts entries pointing metadata URLs at the wrong server.","solutions":["Verify the metadata endpoint returns a non-empty region (curl the metadata URL for region)","If the host is not DigitalOcean, disable the env_digitalocean fingerprint in client config","Remove stale /etc/hosts entries or proxies that answer for the DigitalOcean metadata hostname","Retry fingerprinting after fixing connectivity (the fingerprint is reloadable)"],"exampleFix":"// before\nclient { }\n// after\nclient {\n  fingerprint {\n    \"env_digitalocean\" { disabled = true }\n  }\n}","handlingStrategy":"validation","validationCode":"// Pre-check before relying on DigitalOcean attributes\nresp, _ := http.Get(\"https://169.254.169.254/metadata/v1/region\")\nbody, _ := io.ReadAll(resp.Body)\nif strings.TrimSpace(string(body)) == \"\" {\n    // missing region: disable env_digitalocean fingerprint or fix metadata access\n}","typeGuard":"func hasNonEmptyMetadata(body []byte) bool {\n    return len(strings.TrimSpace(string(body))) > 0\n}","tryCatchPattern":null,"preventionTips":["Verify the DigitalOcean metadata service returns a region before enabling related config","Disable env_digitalocean fingerprint on hosts that are not DigitalOcean droplets","Remove stale hosts-file entries or proxies answering for metadata URLs","Re-fingerprint after connectivity fixes since the probe is reloadable"],"tags":["fingerprint","digitalocean","metadata-service","network"],"backgroundTag":"empty-metadata-response","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}