使用 Python 和 Prometheus 跟踪天气
天气 Prometheus

> 
> 创建自定义 Prometheus 集成以跟踪最大的云端提供商：地球母亲。
> 
> 
> 


![Tree clouds](/data/attachment/album/201905/03/131641zrunsntko3onnzlp.png "Tree clouds")


开源监控系统 [Prometheus](https://prometheus.io/) 集成了跟踪多种类型的时间序列数据，但如果没有集成你想要的数据，那么很容易构建一个。一个经常使用的例子使用云端提供商的自定义集成，它使用提供商的 API 抓取特定的指标。但是，在这个例子中，我们将与最大云端提供商集成：地球。


幸运的是，美国政府已经测量了天气并为集成提供了一个简单的 API。获取红帽总部下一个小时的天气预报很简单。



```
import requests
HOURLY_RED_HAT = "<https://api.weather.gov/gridpoints/RAH/73,57/forecast/hourly>"
def get_temperature():
    result = requests.get(HOURLY_RED_HAT)
    return result.json()["properties"]["periods"][0]["temperature"]
```

现在我们已经完成了与地球的集成，现在是确保 Prometheus 能够理解我们想要内容的时候了。我们可以使用 [Prometheus Python 库](https://github.com/prometheus/client_python)中的 gauge 创建一个注册项：红帽总部的温度。



```
from prometheus_client import CollectorRegistry, Gauge
def prometheus_temperature(num):
    registry = CollectorRegistry()
    g = Gauge("red_hat_temp", "Temperature at Red Hat HQ", registry=registry)
    g.set(num)
    return registry
```

最后，我们需要以某种方式将它连接到 Prometheus。这有点依赖 Prometheus 的网络拓扑：是 Prometheus 与我们的服务通信更容易，还是反向更容易。


第一种是通常建议的情况，如果可能的话，我们需要构建一个公开注册入口的 Web 服务器，并配置 Prometheus 收刮（scrape）它。


我们可以使用 [Pyramid](https://trypyramid.com/) 构建一个简单的 Web 服务器。



```
from pyramid.config import Configurator
from pyramid.response import Response
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
def metrics_web(request):
    registry = prometheus_temperature(get_temperature())
    return Response(generate_latest(registry),
                               content_type=CONTENT_TYPE_LATEST)
config = Configurator()
config.add_route('metrics', '/metrics')
config.add_view(metrics_web, route_name='metrics')
app = config.make_wsgi_app()
```

这可以使用任何 Web 网关接口（WSGI）服务器运行。例如，假设我们将代码放在 `earth.py` 中，我们可以使用 `python -m twisted web --wsgi earth.app` 来运行它。


或者，如果我们的代码连接到 Prometheus 更容易，我们可以定期将其推送到 Prometheus 的[推送网关](https://github.com/prometheus/pushgateway)。



```
import time
from prometheus_client import push_to_gateway
def push_temperature(url):
    while True:
        registry = prometheus_temperature(get_temperature())
        push_to_gateway(url, "temperature collector", registry)
        time.sleep(60*60)
```

这里的 URL 是推送网关的 URL。它通常以 `:9091` 结尾。


祝你构建自定义 Prometheus 集成成功，以便跟踪一切！




---


via: <https://opensource.com/article/19/4/weather-python-prometheus>


作者：[Moshe Zadka](https://opensource.com/users/moshez) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


OK
Open source monitoring system [Prometheus](https://prometheus.io/) has integrations to track many types of time-series data, but if you want an integration that doesn't yet exist, it's easy to build one. An often-used example is a custom integration with a cloud provider that uses the provider's APIs to grab specific metrics. In this example, though, we will integrate with the biggest cloud provider of all: Earth.

Luckily, the US government already measures the weather and provides an easy API for integrations. Getting the weather forecast for the next hour at Red Hat headquarters is simple.

```
import requests
HOURLY_RED_HAT = "https://api.weather.gov/gridpoints/RAH/73,57/forecast/hourly"
def get_temperature():
result = requests.get(HOURLY_RED_HAT)
return result.json()["properties"]["periods"][0]["temperature"]
```


Now that our integration with Earth is done, it's time to make sure Prometheus can understand what we are saying. We can use the [Prometheus Python library](https://github.com/prometheus/client_python) to create a registry with one *gauge*: the temperature at Red Hat HQ.

```
from prometheus_client import CollectorRegistry, Gauge
def prometheus_temperature(num):
registry = CollectorRegistry()
g = Gauge("red_hat_temp", "Temperature at Red Hat HQ", registry=registry)
g.set(num)
return registry
```


Finally, we need to connect this to Prometheus in some way. That depends a little on the network topology for Prometheus: whether it is easier for Prometheus to talk to our service, or whether the reverse is easier.

The first case is the one usually recommended, if possible, so we need to build a web server exposing the registry and then configure Prometheus to *scrape* it.

We can build a simple web server with [Pyramid](https://trypyramid.com/).

```
from pyramid.config import Configurator
from pyramid.response import Response
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
def metrics_web(request):
registry = prometheus_temperature(get_temperature())
return Response(generate_latest(registry),
content_type=CONTENT_TYPE_LATEST)
config = Configurator()
config.add_route('metrics', '/metrics')
config.add_view(metrics_web, route_name='metrics')
app = config.make_wsgi_app()
```



This can be run with any Web Server Gateway Interface (WSGI) server. For example, we can use **python -m twisted web --wsgi earth.app** to run it, assuming we put the code in **earth.py**.

Alternatively, if it is easier for our code to connect to Prometheus, we can push it to Prometheus's [Push gateway](https://github.com/prometheus/pushgateway) periodically.

```
import time
from prometheus_client import push_to_gateway
def push_temperature(url):
while True:
registry = prometheus_temperature(get_temperature())
push_to_gateway(url, "temperature collector", registry)
time.sleep(60*60)
```


The URL is the one for the Push gateway; it often ends in **:9091**.

Good luck building your own custom Prometheus integration so you can track all the things!

## 1 Comment