{"id":13582363,"url":"https://github.com/williamchanrico/planet-exporter","last_synced_at":"2026-03-11T00:49:04.341Z","repository":{"id":45281423,"uuid":"293347676","full_name":"williamchanrico/planet-exporter","owner":"williamchanrico","description":":rocket: Determine server network dependencies along with required bandwidth","archived":false,"fork":false,"pushed_at":"2025-01-23T03:56:06.000Z","size":580,"stargazers_count":23,"open_issues_count":2,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-06T10:44:42.699Z","etag":null,"topics":["darkstat","dependency-graph","ebpf-exporter","network-monitoring","planet-exporter","prometheus","prometheus-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/williamchanrico.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-09-06T19:27:13.000Z","updated_at":"2025-02-22T14:49:10.000Z","dependencies_parsed_at":"2024-01-17T05:25:13.576Z","dependency_job_id":"2f950697-08ea-4762-87e8-1e6acd942e71","html_url":"https://github.com/williamchanrico/planet-exporter","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/williamchanrico/planet-exporter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamchanrico%2Fplanet-exporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamchanrico%2Fplanet-exporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamchanrico%2Fplanet-exporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamchanrico%2Fplanet-exporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/williamchanrico","download_url":"https://codeload.github.com/williamchanrico/planet-exporter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamchanrico%2Fplanet-exporter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30364156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["darkstat","dependency-graph","ebpf-exporter","network-monitoring","planet-exporter","prometheus","prometheus-exporter"],"created_at":"2024-08-01T15:02:38.645Z","updated_at":"2026-03-11T00:49:04.292Z","avatar_url":"https://github.com/williamchanrico.png","language":"Go","funding_links":[],"categories":["Go","others"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003ePlanet Exporter\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./flow.png\" /\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eKnow your network dependencies!\u003c/strong\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  A simple Prometheus exporter that provides understanding of your machines network dependencies.\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003c!-- Goreleaser Build --\u003e\n  \u003ca href=\"https://github.com/williamchanrico/planet-exporter/releases\"\u003e\n    \u003cimg alt=\"Goreleaser Build\" src=\"https://img.shields.io/github/actions/workflow/status/williamchanrico/planet-exporter/release.yml?style=flat-square\u0026label=Goreleaser\"\u003e\n  \u003c/a\u003e\n  \u003c!-- Release --\u003e\n  \u003ca href=\"https://github.com/williamchanrico/planet-exporter/releases\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/v/release/williamchanrico/planet-exporter?style=flat-square\u0026label=Release\"\n      alt=\"Release\" /\u003e\n  \u003c/a\u003e\n  \u003c!-- Go Version --\u003e\n  \u003ca href=\"https://github.com/williamchanrico/planet-exporter/releases\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/go-mod/go-version/williamchanrico/planet-exporter?color=67CFDC\u0026style=flat-square\"\n      alt=\"Go Version\" /\u003e\n  \u003c/a\u003e\n  \u003c!-- CodeQL Analysis --\u003e\n  \u003ca href=\"https://github.com/williamchanrico/planet-exporter/releases\"\u003e\n    \u003cimg alt=\"CodeQL Analysis\" src=\"https://img.shields.io/github/actions/workflow/status/williamchanrico/planet-exporter/codeql-analysis.yml?label=CodeQL\u0026style=flat-square\"\u003e\n  \u003c/a\u003e\n  \u003c!-- Apache License --\u003e\n  \u003ca href=\"https://github.com/williamchanrico/planet-exporter/blob/master/LICENSE\"\u003e\u003cimg\n    src=\"https://img.shields.io/github/license/williamchanrico/planet-exporter?color=blue\u0026style=flat-square\u0026label=License\"\n    border=\"0\"\n    alt=\"Apache-2.0 Licence\"\n    title=\"Apache-2.0 Licence\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n## Table of Content\n\n  * [Table of Content](#table-of-content)\n  * [Introduction](#introduction)\n  * [Installation](#installation)\n  * [Configuration](#configuration)\n  * [Project Structure](#project-structure)\n  * [Collector Tasks](#collector-tasks)\n    + [Inventory](#inventory)\n    + [Socketstat](#socketstat)\n    + [Darkstat](#darkstat)\n    + [EBPF Exporter](#ebpf-exporter)\n  * [Exporter Cost](#exporter-cost)\n- [Tools](#tools)\n  * [Planet Federator](#planet-federator)\n    + [Example InfluxQL](#example-influxql)\n  * [Planet Federator InfluxDB to BQ](#planet-federator-influxdb-to-bigquery)\n- [Ansible Role](#ansible-role)\n- [Go Version](#go-version)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Introduction\n\nSimple discovery space-ship for your ~~infrastructure~~ planetary ecosystem across the universe.\n\nThe primary goal here is to determine every servers' network dependencies (upstream/downstream) along with their bandwidth usage.\n\nMeasure an environment's potential to maintain ~~services~~ life.\n\n## Installation\n\nGrab a pre-built binary for your OS from the [Releases](https://github.com/williamchanrico/planet-exporter/releases/latest) page.\n\n## Configuration\n\nThere are no required flags. It is configured with usable defaults where only `--task-socketstat-enabled` is on.\n\n```\nUsage of planet-exporter:\n  -listen-address string\n        Address to which exporter will bind its HTTP interface (default \"0.0.0.0:19100\")\n  -log-disable-colors\n        Disable colors on logger\n  -log-disable-timestamp\n        Disable timestamp on logger\n  -log-level string\n        Log level (default \"info\")\n  -task-darkstat-addr string\n        Darkstat target address\n  -task-darkstat-enabled\n        Enable darkstat collector task\n  -task-ebpf-addr string\n        Ebpf target address (default \"http://localhost:9435/metrics\")\n  -task-ebpf-enabled\n        Enable Ebpf collector task\n  -task-interval string\n        Interval between collection of expensive data into memory (default \"7s\")\n  -task-inventory-addr string\n        HTTP endpoint that returns the inventory data\n  -task-inventory-enabled\n        Enable inventory collector task\n  -task-inventory-format string\n        Inventory format to parse the returned inventory data (default \"arrayjson\")\n  -task-socketstat-enabled\n        Enable socketstat collector task (default true)\n  -version\n        Show version and exit\n```\n\nRunning **without any flags** (it enables only the socketstat collector task)\n\n```\n# planet-exporter\n```\n\nRunning **with inventory and darkstat** (darkstat has to be installed separately rev \u003e= [e7e6652](https://www.unix4lyfe.org/gitweb/darkstat/commit/e7e6652113099e33930ab0f39630bf280e38f769)). See example darkstat [init.cfg](setup/darkstat/init.cfg).\n\n```sh\nplanet-exporter \\\n  -task-inventory-enabled \\\n  -task-inventory-addr http://link-to-your.net/inventory_hosts.json \\\n  -task-darkstat-enabled \\\n  -task-darkstat-addr http://localhost:51666/metrics\n```\n\nRunning **with another inventory format**\n\n```sh\nplanet-exporter \\\n  -task-inventory-enabled \\\n  -task-inventory-format \"ndjson\" \\\n  -task-inventory-addr http://link-to-your.net/inventory_hosts.json\n```\n\nRunning **with ebpf_exporter and another inventory format**\n\n* Follow instructions on https://github.com/cloudflare/ebpf_exporter to start ebpf_exporter with example [tcptop.yaml](setup/ebpf-exporter/tcptop.yaml) configuration.\n\n```sh\nplanet-exporter \\\n  -task-ebpf-enabled \\\n  -task-inventory-enabled \\\n  -task-inventory-format \"ndjson\" \\\n  -task-inventory-addr http://link-to-your.net/inventory_hosts.json\n```\n\n## Project Structure\n\n![project-structure](project-structure.png)\n\n* The `collector` implements prometheus.Collector interface and is the one behind promhttp.Handler. It leverages `task/*` packages for expensive metrics (also as cache) instead of preparing them on every prometheus.Collect.\n* The `task/*` packages are the crew that are doing the expensive tasks behind the scene. They store the data for the `collector` package.\n\n## Collector Tasks\n\nThis is the heart of Planet Exporter that's doing the heavy-lifting. Integrations with other dependencies happen here.\n\n### Inventory\n\nQuery inventory data that will be used to map `ip_address` into `hostgroup` (an identifier based on Ansible convention) and `domain`.\nThe `ip_address` may use CIDR notation (e.g. \"10.1.0.0/16\") and Inventory task will use the longest-prefix match.\n\nWithout this task enabled, those hostgroup and domain fields will be empty.\n\nRelated flags:\n\n* `--task-inventory-enabled=true` to enable the task.\n* `--task-inventory-addr` accepts an HTTP endpoint that returns inventory data in the supported format.\n* `--task-inventory-format` to choose the supported format for the inventory data.\n\nInventory formats:\n\n1. --task-inventory-format=arrayjson\n\n```json\n[\n  {\n    \"ip_address\": \"10.1.2.3\",\n    \"domain\": \"xyz.service.consul\",\n    \"hostgroup\": \"xyz\"\n  },\n  {\n    \"ip_address\": \"10.2.3.4\",\n    \"domain\": \"debugapp.service.consul\",\n    \"hostgroup\": \"debugapp\"\n  },\n  {\n    \"ip_address\": \"10.3.0.0/16\",\n    \"domain\": \"\",\n    \"hostgroup\": \"unknown-but-its-network-xyz\"\n  }\n]\n```\n\n2. --task-inventory-format=ndjson\n\n```json\n{\"ip_address\":\"10.0.1.2\",\"domain\":\"xyz.service.consul\",\"hostgroup\":\"xyz\"}\n{\"ip_address\":\"172.16.1.2\",\"domain\":\"abc.service.consul\",\"hostgroup\":\"abc\"}\n{\"ip_address\":\"10.3.0.0/16\",\"domain\":\"\",\"hostgroup\":\"unknown-but-its-network-xyz\"}\n```\n\n### Socketstat\n\nQuery local connections socket similar to `ss` or `netstat` to build upstream and downstream dependency metrics.\n\n```\n# HELP planet_upstream Upstream dependency of this machine\n# TYPE planet_upstream gauge\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"80\",process_name=\"debugapp\",protocol=\"tcp\",remote_address=\"xyz.service.consul\",remote_hostgroup=\"xyz\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"8500\",process_name=\"consul-template\",protocol=\"tcp\",remote_address=\"127.0.0.1\",remote_hostgroup=\"localhost\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"8300\",process_name=\"consul\",protocol=\"tcp\",remote_address=\"10.2.3.3\",remote_hostgroup=\"consul-server\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"8300\",process_name=\"consul\",protocol=\"tcp\",remote_address=\"10.2.3.4\",remote_hostgroup=\"consul-server\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"3128\",process_name=\"\",protocol=\"tcp\",remote_address=\"100.100.98.18\",remote_hostgroup=\"\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"443\",process_name=\"\",protocol=\"tcp\",remote_address=\"35.158.25.125\",remote_hostgroup=\"\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"443\",process_name=\"\",protocol=\"tcp\",remote_address=\"52.219.32.222\",remote_hostgroup=\"\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"80\",process_name=\"cloudmetrics\",protocol=\"tcp\",remote_address=\"100.100.103.57\",remote_hostgroup=\"\"} 1\nplanet_upstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"80\",process_name=\"cloudmetrics\",protocol=\"tcp\",remote_address=\"100.100.30.26\",remote_hostgroup=\"\"} 1\n# HELP planet_downstream Downstream dependency of this machine\n\n# TYPE planet_downstream gauge\nplanet_downstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"9100\",process_name=\"node_exporter\",protocol=\"tcp\",remote_address=\"prometheus.service.consul\",remote_hostgroup=\"prometheus\"} 1\nplanet_downstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"19100\",process_name=\"planet-exporter\",protocol=\"tcp\",remote_address=\"prometheus.service.consul\",remote_hostgroup=\"prometheus\"} 1\nplanet_downstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"19100\",process_name=\"planet-exporter\",protocol=\"tcp\",remote_address=\"192.168.1.2\",remote_hostgroup=\"\"} 1\nplanet_downstream{local_address=\"debugapp.service.consul\",local_hostgroup=\"debugapp\",port=\"22\",process_name=\"sshd\",protocol=\"tcp\",remote_address=\"192.168.1.2\",remote_hostgroup=\"\"} 1\n\n# HELP planet_server_process Server process that are listening on network interfaces\n# TYPE planet_server_process gauge\nplanet_server_process{bind=\"0.0.0.0:111\",port=\"111\",process_name=\"rpcbind\"} 1\nplanet_server_process{bind=\"0.0.0.0:19100\",port=\"19100\",process_name=\"planet-exporter\"} 1\nplanet_server_process{bind=\"0.0.0.0:22\",port=\"22\",process_name=\"sshd\"} 1\nplanet_server_process{bind=\"0.0.0.0:25\",port=\"25\",process_name=\"master\"} 1\nplanet_server_process{bind=\"0.0.0.0:5666\",port=\"5666\",process_name=\"nrpe\"} 1\nplanet_server_process{bind=\"0.0.0.0:80\",port=\"80\",process_name=\"nginx\"} 1\nplanet_server_process{bind=\"127.0.0.1:53\",port=\"53\",process_name=\"consul\"} 1\nplanet_server_process{bind=\"127.0.0.1:8500\",port=\"8500\",process_name=\"consul\"} 1\nplanet_server_process{bind=\"0.0.0.0:51666\",port=\"51666\",process_name=\"darkstat\"} 1\nplanet_server_process{bind=\":::111\",port=\"111\",process_name=\"rpcbind\"} 1\nplanet_server_process{bind=\":::25\",port=\"25\",process_name=\"master\"} 1\nplanet_server_process{bind=\":::50051\",port=\"50051\",process_name=\"socketmaster\"} 1\nplanet_server_process{bind=\":::5666\",port=\"5666\",process_name=\"nrpe\"} 1\nplanet_server_process{bind=\":::8301\",port=\"8301\",process_name=\"consul\"} 1\nplanet_server_process{bind=\":::9000\",port=\"9000\",process_name=\"socketmaster\"} 1\nplanet_server_process{bind=\":::9100\",port=\"9100\",process_name=\"node_exporter\"} 1\nplanet_server_process{bind=\":::9256\",port=\"9256\",process_name=\"process_exporte\"} 1\n```\n\nRelated flags:\n\n* `--task-socketstat-enabled=true` to enable the task.\n\n### Darkstat\n\n[Darkstat](https://unix4lyfe.org/darkstat/) captures network traffic, calculates statistics about usage, and serves reports over HTTP.\n\nThough there's no port detection from darkstat to determine remote/local port for each traffic direction, the bandwidth information can still be useful.\n\nNOTE: this means we'll have to install darkstat along with planet-exporter.\n\nExample parsed metrics from darkstat when enabled (plus inventory task for `remote_domain` and `remote_hostgroup`):\n\n```\n# HELP planet_traffic_bytes_total Total network traffic with peers\n# TYPE planet_traffic_bytes_total gauge\nplanet_traffic_bytes_total{direction=\"egress\",remote_domain=\"xyz.service.consul\",remote_hostgroup=\"xyz\",remote_ip=\"10.1.2.3\"} 2005\nplanet_traffic_bytes_total{direction=\"egress\",remote_domain=\"debugapp.service.consul\",remote_hostgroup=\"debugapp\",remote_ip=\"10.2.3.4\"} 150474\nplanet_traffic_bytes_total{direction=\"ingress\",remote_domain=\"xyz.service.consul\",remote_hostgroup=\"xyz\",remote_ip=\"10.1.2.3\"} 2525\nplanet_traffic_bytes_total{direction=\"ingress\",remote_domain=\"debugapp.service.consul\",remote_hostgroup=\"debugapp\",remote_ip=\"10.2.3.4\"} 1.26014316e+08\n```\n\nRelated flags:\n\n* `--task-darkstat-enabled=true` to enable the task.\n* `--task-darkstat-addr` accepts an HTTP endpoint that returns darkstat metrics.\n\n### EBPF Exporter\n\nPlanet exporter can be used along with [ebpf-exporter](https://github.com/cloudflare/ebpf_exporter) to extract packet flow information directly from kernel. PE currently supports reading prometheus data with [tcptop.yaml](setup/ebpf-exporter/tcptop.yaml) ebpf configuration. Checkout [ebpf-exporter](https://github.com/cloudflare/ebpf_exporter) instructions to run it with [tcptop.yaml](setup/ebpf-exporter/tcptop.yaml).\n\nRelated flags:\n\n* `--task-ebpf-enabled=true` to enable the task.\n* `--task-ebpf-addr` accepts an HTTP endpoint that returns ebpf_exporter metrics (see [tcptop.yaml](setup/ebpf-exporter/tcptop.yaml) for the expected metrics values and format)\n\n# Exporter Cost\n\nPlanet exporter will consume CPU and Memory in proportion to the number\nof opened network file descriptors (opened sockets).\n\n# Tools\n\n## Planet Federator\n\nDashboard queries on Planet Exporter raw data in Prometheus can get expensive very fast.\nA tested 1-hour range query for a crowded machine with ~300 upstreams/downstreams took about `9s`.\n\nTo improve query efficiency, Planet Federator aggregates Prometheus metrics collected from all the Planet Exporters. The aggregation is based on all except `ip_address` metrics label, therefore individual `ip_address` granularity is lost.\n\nPlanet Exporter runs a cron that queries Planet Exporter's traffic bandwidth data from Prometheus, process, and\nstore them in a time-series database for clean and more efficient queries.\n\nLast tested query duration, before and after Planet Federator was `2.678s` vs `330ms`.\n\nTSDB supports:\n- [x] InfluxDB\n- [ ] Prometheus\n- [ ] BigQuery\n\n### Example InfluxQL\n\nThese queries should be enough to build a useful dashboard based on Planet Exporter and Planet Federator processed metrics.\n\n```sql\n-- Example InfluxQL: Produces time series data showing traffic bandwidth for service = $service\nSELECT\n  SUM(\"bandwidth_bps\")\nFROM\n  \"ingress\"\nWHERE\n  (\"service\" = '$service') AND $timeFilter\nGROUP BY\n  time($__interval), \"service\", \"remote_service\", \"remote_address\"\n\n-- Example InfluxQL: Produces tabular format listing upstreams for service = $service\nSELECT\n    SUM(\"service_dependency\")\nFROM (\n    SELECT * FROM \"upstream\" WHERE (\"service\" = '$service') AND Time \u003e now() - 7d\n)\nGROUP BY\n    \"upstream_service\", \"upstream_address\", \"process_name\", \"upstream_port\", \"protocol\", time(10000d)\n\n-- Example InfluxQL: Produces tabular format listing downstreams for service = $service\nSELECT\n    SUM(\"service_dependency\")\nFROM (\n    SELECT * FROM \"downstream\" WHERE (\"service\" = '$service') AND Time \u003e now() - 7d\n)\nGROUP BY\n    \"downstream_service\", \"downstream_address\", \"process_name\", \"port\", \"protocol\", time(10000d)\n```\n\n```sh\n$ planet-federator \\\n    -prometheus-addr \"http://127.0.0.1:9090\" \\\n    -influxdb-addr \"http://127.0.0.1:8086\" \\\n    -influxdb-bucket \"mothership\" # Works as database name if you're using InfluxDB v1.8 and earlier\n```\n\n## Planet Federator InfluxDB to BigQuery\n\nThis tool helps query and aggregate the Planet Federator data further into 2 categories: (1) Traffic Bandwidth data \u0026 (2) Dependency list data, for every services, stored in BigQuery tables.\n\nRead more in [cmd/planet-federator-influxdb-to-bq](./cmd/planet-federator-influxdb-to-bq)\n\n# Ansible Role\n\nFind the sample Ansible Roles in [./setup/ansible-roles](./setup/ansible-roles) to help setup Planet Exporter or Planet Federator.\n\nGenerally, planet_exporter is installed as a sidecar agent on most (if not all) servers,\nwhile planet_federator is installed on an influxdb server.\n\nRemember that for planet-federator-influxdb-to-bq to work, provide the instance's Service Account a write access to target BQ Tables (i.e. roles/bigquery.dataEditor).\n\n# Go Version\n\n```\n$ go version\ngo version go1.20 linux/amd64\n```\n\n\u003e Older Go versions should work fine.\n\n# Contributing\n\nPull requests for new features, bug fixes, and suggestions are welcome!\n\n# License\n\n[Apache License 2.0](https://github.com/williamchanrico/planet-exporter/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamchanrico%2Fplanet-exporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwilliamchanrico%2Fplanet-exporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamchanrico%2Fplanet-exporter/lists"}