---
# System prepended metadata

title: prometheus remote write client

---

# prometheus remote write client

# Introduction

TL;DR: 要用google的protobuf，並且用snappy壓縮，再加上sigv4 auth傳過去

### Reference

obsolete example

[Example Python Prometheus remote write client](https://gist.github.com/robskillington/fb82ee5c737b79a3bc891df3dce7a9aa)

protobuf教學

[](https://ithelp.ithome.com.tw/articles/10250131)

# 前置作業

### 安裝protobuf compiler

官方下載

[https://github.com/protocolbuffers/protobuf/releases](https://github.com/protocolbuffers/protobuf/releases)

或是mac直接 `brew install protobuf`

[https://blog.keniver.com/2020/03/install-protobuf-compiler-on-macos/](https://blog.keniver.com/2020/03/install-protobuf-compiler-on-macos/)

### Python Requirement

- [google snappy](http://google.github.io/snappy/) compresser

`pip install python-snappy`

[python-snappy](https://pypi.org/project/python-snappy/)

- Protobuf Runtime

`pip install protobuf`

[GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format](https://github.com/protocolbuffers/protobuf#protobuf-runtime-installation)

[protobuf/python at main · protocolbuffers/protobuf](https://github.com/protocolbuffers/protobuf/tree/main/python)

- google

`pip install google`

總之會用到

- aws sigv4 auth for python

`pip install requests-auth-aws-sigv4`

[requests-auth-aws-sigv4](https://pypi.org/project/requests-auth-aws-sigv4/)

先確保sigv4能通，可用boto3預設credential or STS token

```python
import requests
from requests_auth_aws_sigv4 import AWSSigV4

r = requests.request('POST', 'https://sts.us-west-2.amazonaws.com', 
    data=dict(Version='2011-06-15', Action='GetCallerIdentity'), 
    auth=AWSSigV4('sts'))
print(r.text)
```

### 下載prometheus remote proto

prometheus自訂的remote proto在此 (latest)

[https://github.com/prometheus/prometheus/tree/main/prompb](https://github.com/prometheus/prometheus/tree/main/prompb)

先下載 [remote.proto](https://github.com/prometheus/prometheus/blob/main/prompb/remote.proto)和[types.proto](https://github.com/prometheus/prometheus/blob/main/prompb/types.proto)

還需要[gogo.proto](https://github.com/gogo/protobuf/blob/master/gogoproto/gogo.proto)

# Development

### compile proto

- 把remote.proto跟types.proto放在目錄下
- create folder `gogoproto` 把gogo.proto放進去
- 執行

```bash
# 產生gogoproto/gogo_pb2.py
cd gogoproto
protoc --python_out=. gogo.proto
# 產生 types_pb2.py
protoc -I=./ -I=./gogoproto --python_out=./ gogoproto/gogo.proto ./types.proto
# 產生 remote_pb2.py
protoc -I=. ./remote.proto
```

### python code

```python
from datetime import datetime
from remote_pb2 import (
    WriteRequest
)
from types_pb2 import(
    TimeSeries,
    Label,
    Labels,
    Sample
)

import calendar
# import logging
import requests
import snappy
from requests_auth_aws_sigv4 import AWSSigV4

def dt2ts(dt):
    """Converts a datetime object to UTC timestamp
    naive datetime will be considered UTC.
    """
    return calendar.timegm(dt.utctimetuple())

def write():
    write_request = WriteRequest()

    series = write_request.timeseries.add()

    # name label always required
    label = series.labels.add()
    label.name = "__name__"
    label.value = "metric_name"
    
    # as many labels you like
    label = series.labels.add()
    label.name = "ssl_cipher"
    label.value = "some_value"

    sample = series.samples.add()
    sample.value = 42 # your count?
    sample.timestamp = dt2ts(datetime.utcnow()) * 1000

    uncompressed = write_request.SerializeToString()
    compressed = snappy.compress(uncompressed)

    url = "amp remote_write endpoint"
    headers = {
        "Content-Encoding": "snappy",
        "Content-Type": "application/x-protobuf",
        "X-Prometheus-Remote-Write-Version": "0.1.0",
        "User-Agent": "metrics-worker"
    }
    try:
        response = requests.post(url, headers=headers, data=compressed,auth=AWSSigV4('aps'))
        # print(response.text)
    except exception as e:
        print(e)

write()
```