{"id":13582375,"url":"https://github.com/czerwonk/atlas_exporter","last_synced_at":"2026-01-18T04:24:00.949Z","repository":{"id":20974778,"uuid":"91455542","full_name":"czerwonk/atlas_exporter","owner":"czerwonk","description":"Metric exporter for RIPE Atlas measurement results","archived":false,"fork":false,"pushed_at":"2025-05-20T08:42:39.000Z","size":5870,"stargazers_count":87,"open_issues_count":9,"forks_count":18,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-05-20T09:46:14.745Z","etag":null,"topics":["exporter","metrics","prometheus","ripe-atlas"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/czerwonk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-16T12:25:12.000Z","updated_at":"2025-05-20T08:42:42.000Z","dependencies_parsed_at":"2023-11-29T07:24:02.417Z","dependency_job_id":"66af1de9-4b2e-4667-8983-6669f38843a4","html_url":"https://github.com/czerwonk/atlas_exporter","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/czerwonk/atlas_exporter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/czerwonk%2Fatlas_exporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/czerwonk%2Fatlas_exporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/czerwonk%2Fatlas_exporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/czerwonk%2Fatlas_exporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/czerwonk","download_url":"https://codeload.github.com/czerwonk/atlas_exporter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/czerwonk%2Fatlas_exporter/sbom","scorecard":{"id":314995,"data":{"date":"2025-08-11","repo":{"name":"github.com/czerwonk/atlas_exporter","commit":"6d7b392d4ce6d87b6dd51ffbae27ff28b0bd9352"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Maintained","score":2,"reason":"3 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/6 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/docker_latest.yml:1","Warn: no topLevel permission defined: .github/workflows/docker_tag.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Lesser General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 1.0.4 not signed: https://api.github.com/repos/czerwonk/atlas_exporter/releases/83892072","Warn: release artifact 1.0.3 not signed: https://api.github.com/repos/czerwonk/atlas_exporter/releases/56994596","Warn: release artifact 1.0 not signed: https://api.github.com/repos/czerwonk/atlas_exporter/releases/12287494","Warn: release artifact 0.8 not signed: https://api.github.com/repos/czerwonk/atlas_exporter/releases/11882905","Warn: release artifact 0.7 not signed: https://api.github.com/repos/czerwonk/atlas_exporter/releases/11471566","Warn: release artifact 1.0.4 does not have provenance: https://api.github.com/repos/czerwonk/atlas_exporter/releases/83892072","Warn: release artifact 1.0.3 does not have provenance: https://api.github.com/repos/czerwonk/atlas_exporter/releases/56994596","Warn: release artifact 1.0 does not have provenance: https://api.github.com/repos/czerwonk/atlas_exporter/releases/12287494","Warn: release artifact 0.8 does not have provenance: https://api.github.com/repos/czerwonk/atlas_exporter/releases/11882905","Warn: release artifact 0.7 does not have provenance: https://api.github.com/repos/czerwonk/atlas_exporter/releases/11471566"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker_latest.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_latest.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker_latest.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_latest.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker_latest.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_latest.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker_latest.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_latest.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker_tag.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_tag.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker_tag.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_tag.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker_tag.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_tag.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker_tag.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/docker_tag.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/czerwonk/atlas_exporter/test.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:7: pin your Docker image by updating alpine:latest to alpine:latest@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/docker_latest.yml:10"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T23:59:36.397Z","repository_id":20974778,"created_at":"2025-08-17T23:59:36.397Z","updated_at":"2025-08-17T23:59:36.397Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28529507,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["exporter","metrics","prometheus","ripe-atlas"],"created_at":"2024-08-01T15:02:39.397Z","updated_at":"2026-01-18T04:24:00.918Z","avatar_url":"https://github.com/czerwonk.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# atlas_exporter \n[![Go Report Card](https://goreportcard.com/badge/github.com/czerwonk/atlas_exporter)](https://goreportcard.com/report/github.com/czerwonk/atlas_exporter)\n\nMetric exporter for RIPE Atlas measurement results\n\n## Remarks\n* this is an early version, more features will be added step by step\n* at the moment only the last result of an measurement is used\n* the required Go version is 1.19+\n\n## Streaming API\nSince version 0.8 atlas_exporter also supports retrieving measurement results by RIPE Atlas Streaming API (https://atlas.ripe.net/docs/result-streaming/). Using this feature requires config file mode. All configured measurements are subscribed on start so the latest result for each probe is updated continuously and scrape time is reduced significantly. When a socket.io connection fails or times out a reconnect is initiated. The timeout can be configured using the `-streaming.timeout` parameter. Streaming API is the default for config file mode, it can be disabled by setting `-streaming` to false.\n\n## Histograms\nSince version 1.0 atlas_exporter provides you with histograms of round trip times of the following measurement types:\n* DNS\n* Ping\n* Traceroute\n* HTTP\n\nThe buckets can be configured in the config file (see below).\n\nSince this feature relies strongly on getting each update for a measurement, the Stream API mode has to be used.\nHistogram metrics enables you to calculate percentiles for a specifiv indicator (in our case round trip time). This allows better monitoring of defined service level objectives (e.g. Ping RTT of a specific measurement should be under a specific threshold based on 90% of the requests disregarding the highest 10% -\u003e p90).\n\nFor more information:\nhttps://prometheus.io/docs/practices/histograms/\n\n## Install\n```\ngo get -u github.com/czerwonk/atlas_exporter\n```\n\n## Docker\nTo start the server:\n```\ndocker run -d --restart unless-stopped -p 9400:9400 czerwonk/atlas_exporter\n```\nTo run in config file mode:\n```\ndocker run -d -e CONFIG=/tmp/config.yml -v /tmp/config.yml:/tmp/config.yml --restart unless-stopped -p 9400:9400 czerwonk/atlas_exporter \n``` \n\n## Usage\n### Start server\n```\n./atlas_exporter\n```\nor using config file mode:\n```\n./atlas_exporter -config.file config.yml\n```\n\n### Config file\nfor this example we want to retrieve results for measurement 8772164\n```YAML\nmeasurements:\n  - id: 8772164\n    timeout: 120s\nhistogram_buckets:\n  ping:\n    rtt:\n      - 5.0\n      - 10.0\n      - 25.0\n      - 50.0\n      - 100.0\nfilter_invalid_results: true\n ```\n\n### Call metrics URI\nwhen using config file mode:\n```\ncurl http://127.0.0.1:9400/metrics\n```\nor ad hoc for measuremnt 8772164:\n```\ncurl http://127.0.0.1:9400/metrics?measurement_id=8772164\n```\nin both cases the result should look similar to this one:\n``` \n# HELP atlas_traceroute_hops Number of hops\n# TYPE atlas_traceroute_hops gauge\natlas_traceroute_hops{asn=\"1101\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"6031\"} 9\natlas_traceroute_hops{asn=\"11051\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"17833\"} 8\natlas_traceroute_hops{asn=\"111\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"6231\"} 9\natlas_traceroute_hops{asn=\"11427\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"1121\"} 13\natlas_traceroute_hops{asn=\"12337\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"267\"} 13\natlas_traceroute_hops{asn=\"1257\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"140\"} 11\natlas_traceroute_hops{asn=\"12586\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"2088\"} 13\natlas_traceroute_hops{asn=\"12597\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"2619\"} 10\natlas_traceroute_hops{asn=\"12714\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"2684\"} 9\natlas_traceroute_hops{asn=\"133752\",dst_addr=\"8.8.8.8\",dst_name=\"8.8.8.8\",ip_version=\"4\",measurement=\"8772164\",probe=\"6191\"} 14\n\n...\n```\n\n## Features\n* ping measurements (success, min/max/avg latency, dups, size)\n* traceroute measurements (success, hop count, rtt)\n* ntp (delay, derivation, ntp version)\n* dns (succress, rtt)\n* http (return code, rtt, http version, header size, body size)  \n* sslcert (alert, rtt)\n\n## Prometheus configuration\n\n### Ad-Hoc Mode\n```yaml\n  - job_name: 'atlas_exporter'\n    scrape_interval: 5m\n    static_configs:\n      - targets:\n        - 7924888\n        - 7924886\n    relabel_configs:\n      - source_labels: [__address__]\n        regex: (.*)(:80)?\n        target_label: __param_measurement_id\n        replacement: ${1}\n      - source_labels: [__param_measurement_id]\n        regex: (.*)\n        target_label: instance\n        replacement: ${1}\n      - source_labels: []\n        regex: .*\n        target_label: __address__\n        replacement: atlas-exporter.mytld:9400\n\n```\n\n### Config Mode\n```yaml\n  - job_name: 'atlas_exporter'\n    scrape_interval: 5m\n    static_configs:\n      - targets:\n          - atlas-exporter.mytld:9400\n```\n\n## Third Party Components\nThis software uses components of the following projects\n* Go bindings for RIPE Atlas API (https://github.com/DNS-OARC/ripeatlas)\n* Prometheus Go client library (https://github.com/prometheus/client_golang)\n\n## License\n(c) Daniel Czerwonk, 2017. Licensed under [LGPL3](LICENSE) license.\n\n## Prometheus\nsee https://prometheus.io/\n\n## The RIPE Atlas Project\nsee http://atlas.ripe.net\n\n## Further reading\nI wrote an article about atlas_exporter for RIPE Labs. It covers version 0.5.\nhttps://labs.ripe.net/Members/daniel_czerwonk/using-ripe-atlas-measurement-results-in-prometheus-with-atlas_exporter\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fczerwonk%2Fatlas_exporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fczerwonk%2Fatlas_exporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fczerwonk%2Fatlas_exporter/lists"}