{"id":29822975,"url":"https://github.com/veerendra2/endoflife_exporter","last_synced_at":"2026-06-16T14:32:28.468Z","repository":{"id":304823915,"uuid":"1016788572","full_name":"veerendra2/endoflife_exporter","owner":"veerendra2","description":"A Prometheus exporter that exposes product versions and their End-of-Life (EOL) dates as metrics using the https://endoflife.date API.","archived":false,"fork":false,"pushed_at":"2026-06-04T09:35:53.000Z","size":209,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T11:08:55.052Z","etag":null,"topics":["end-of-life","eol","golang","promethus-exporter"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veerendra2.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-09T14:22:46.000Z","updated_at":"2026-06-04T09:35:55.000Z","dependencies_parsed_at":"2025-07-16T04:14:20.521Z","dependency_job_id":"eabc381f-a6e9-465e-93e4-259e1eaaa16b","html_url":"https://github.com/veerendra2/endoflife_exporter","commit_stats":null,"previous_names":["veerendra2/endoflife_exporter"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/veerendra2/endoflife_exporter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veerendra2%2Fendoflife_exporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veerendra2%2Fendoflife_exporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veerendra2%2Fendoflife_exporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veerendra2%2Fendoflife_exporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veerendra2","download_url":"https://codeload.github.com/veerendra2/endoflife_exporter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veerendra2%2Fendoflife_exporter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34410780,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"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":["end-of-life","eol","golang","promethus-exporter"],"created_at":"2025-07-29T01:38:08.022Z","updated_at":"2026-06-16T14:32:28.463Z","avatar_url":"https://github.com/veerendra2.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# End-of-Life Exporter\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/endoflife.png\" width=\"90\"/\u003e\n  \u003cimg src=\"./assets/prometheus.png\" width=\"90\"/\u003e\n  \u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/veerendra2/endoflife_exporter/actions\"\u003e\u003cimg src=\"https://github.com/veerendra2/endoflife_exporter/workflows/CI/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/veerendra2/endoflife_exporter\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/veerendra2/endoflife_exporter\" alt=\"Go Report Card\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/veerendra2/endoflife_exporter/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/veerendra2/endoflife_exporter\" alt=\"Release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/veerendra2/endoflife_exporter/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/veerendra2/endoflife_exporter\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/veerendra2/endoflife_exporter/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/veerendra2/endoflife_exporter\" alt=\"Stars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/veerendra2/endoflife_exporter/network/members\"\u003e\u003cimg src=\"https://img.shields.io/github/forks/veerendra2/endoflife_exporter\" alt=\"Forks\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://ghcr.io/veerendra2/endoflife_exporter\"\u003e\u003cimg src=\"https://img.shields.io/badge/ghcr.io-amd64%20%7C%20arm64-blue?style=flat\u0026logo=docker\u0026logoColor=white\" alt=\"Docker\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nA Prometheus exporter that exposes product versions and their End-of-Life (EOL) dates as metrics using the [endoflife.date](https://endoflife.date) API. Information is fetched only when Prometheus scrapes the `/metrics` endpoint.\n\n## Deployment\n\n### Usage\n\n```bash\nUsage: endoflife_exporter [flags]\n\nPrometheus exporter for product versions and their End-of-Life.\n\nFlags:\n  -h, --help                    Show context-sensitive help.\n      --address=\":8080\"         The address where the server should listen on ($ADDRESS).\n      --config=\"config.yml\"     Configuration file path ($CONFIG_FILE)\n      --log.format=\"console\"    Set the output format of the logs. Must be \"console\" or \"json\" ($LOG_FORMAT).\n      --log.level=INFO          Set the log level. Must be \"DEBUG\", \"INFO\", \"WARN\" or \"ERROR\" ($LOG_LEVEL).\n      --log.add-source          Whether to add source file and line number to log records ($LOG_ADD_SOURCE).\n      --version                 Print version information and exit\n```\n\n### Docker Compose\n\n```yaml\n---\nservices:\n  endoflife_exporter:\n    image: ghcr.io/veerendra2/endoflife_exporter:latest\n    container_name: endoflife_exporter\n    restart: unless-stopped\n    environment:\n      ADDRESS: \":8080\"\n      CONFIG_FILE: \"/config.yml\"\n      LOG_FORMAT: \"console\"\n    volumes:\n      - ./config.yml:/config.yml\n    ports:\n      - 8080:8080\n```\n\n```bash\ndocker compose up -d\n```\n\n## Configuration\n\nConfigure products and their release cycles as shown below.\n\n\u003e 💡 Always verify product names on [endoflife.date](https://endoflife.date/). If you don't specify a release, it defaults to the `latest` available one.\n\n```yaml\n---\nproducts:\n  - name: mongo\n    releases:\n      - \"8.0\"\n      - \"7.0\"\n  - name: redis\n  - name: ubuntu\n    all_releases: true\n```\n\n## Prometheus Configuration\n\nBelow is an example scrape configuration for Prometheus.\n\n```yaml\n---\nscrape_configs:\n  - job_name: \"endoflife_exporter\"\n    scrape_interval: 168h # Every week\n    scrape_timeout: 2m # If you have a long list of products, you might want to increase the timeout.\n    static_configs:\n      - targets: [\"endoflife_exporter:8080\"]\n```\n\n### Alerting Rules Example\n\n```yaml\ngroups:\n  - name: endoflife.rules\n    rules:\n      - alert: ProductVersionEOLReachingSoon\n        expr: avg by (product_name, release_cycle_name) (endoflife_eol_from_timestamp_seconds - time()) \u003c (21 * 24 * 3600)\n        for: 1h\n        labels:\n          severity: error\n        annotations:\n          message: 'Product ''{{ $labels.product_name }}'' release cycle ''{{ $labels.release_cycle_name }}'' reached its End-of-Life on {{ ($value | timestamp \"2006-01-02\") }}.'\n```\n\n## Metrics\n\nSee [metrics](https://github.com/veerendra2/endoflife_exporter/wiki/Metrics)\n\n## Grafana Dashboard\n\n- [Download Grafana Dashboard Json](./assets/endoflife-grafana-dashboard.json)\n\n![Dashboard Screenshot](./assets/dashboard-screenshot.png)\n\n## Development\n\nInstall [task](https://taskfile.dev/docs/installation)\n\n```bash\ngo mod tidy\n\n# Install dependencies\ntask gen\n\n# Run tests\ntask test\n\n# List all tasks\ntask --list\ntask: Available tasks for this project:\n* all:                   Run comprehensive checks: format, lint, security and test\n* build:                 Build the application binary for the current platform\n* build-docker:          Build Docker image\n* build-platforms:       Build the application binaries for multiple platforms and architectures\n* fmt:                   Formats all Go source files\n* gen:                   Generates Go types from OAPI spec      (aliases: generate)\n* install:               Install required tools and dependencies\n* lint:                  Run static analysis and code linting using golangci-lint\n* run:                   Runs the main application\n* security:              Run security vulnerability scan\n* test:                  Runs all tests in the project      (aliases: tests)\n* vet:                   Examines Go source code and reports suspicious constructs\n```\n\nUpdate endoflife OpenAPI Spec\n\n- Check https://endoflife.date/docs/api/v1/ for changes.\n- Update pkg/endoflife/openapi.yaml if needed and run `task gen` again.\n- The upstream OpenAPI spec has a type mismatch: `isEoes` is defined as `string` but the API returns `boolean`\n  - **Workaround**: Before running `task gen`, manually change the type at [line 564 in openapi.yaml](./pkg/endoflife/openapi.yaml#L564):\n    ```yaml\n    isEoes:\n      type: boolean # Changed from 'string'\n      nullable: true\n    ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveerendra2%2Fendoflife_exporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveerendra2%2Fendoflife_exporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveerendra2%2Fendoflife_exporter/lists"}