Files
Azfaar Qureshi f6f5b90aeb Prometheus Remote Write Exporter (6/6) (#227)
* adding README

adding sample app

adding examples readme

fixing lint errors

linting examples

updating readme tls_config example

excluding examples

adding examples to exclude in all linters

adding isort.cfg skip

changing isort to path

ignoring yml only

adding it to excluded directories in pylintrc

only adding exclude to directory

removing readme.rst and adding explicit file names to ignore

adding the rest of the files

adding readme.rst back

adding to ignore glob instead

reverting back to ignore list

converting README.md to README.rst

* addressing readme comments

* adding link to spec for details on aggregators

* updating readme

* adding python-snappy to setup.cfg
2020-12-22 11:06:22 -08:00

154 lines
3.8 KiB
Python

import logging
import random
import sys
import time
from logging import INFO
import psutil
from opentelemetry import metrics
from opentelemetry.exporter.prometheus_remote_write import (
PrometheusRemoteWriteMetricsExporter,
)
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export.aggregate import (
HistogramAggregator,
LastValueAggregator,
MinMaxSumCountAggregator,
SumAggregator,
)
from opentelemetry.sdk.metrics.view import View, ViewConfig
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logger = logging.getLogger(__name__)
metrics.set_meter_provider(MeterProvider())
meter = metrics.get_meter(__name__)
exporter = PrometheusRemoteWriteMetricsExporter(
endpoint="http://cortex:9009/api/prom/push",
headers={"X-Scope-Org-ID": "5"},
)
metrics.get_meter_provider().start_pipeline(meter, exporter, 1)
testing_labels = {"environment": "testing"}
# Callback to gather cpu usage
def get_cpu_usage_callback(observer):
for (number, percent) in enumerate(psutil.cpu_percent(percpu=True)):
labels = {"cpu_number": str(number)}
observer.observe(percent, labels)
# Callback to gather RAM usage
def get_ram_usage_callback(observer):
ram_percent = psutil.virtual_memory().percent
observer.observe(ram_percent, {})
requests_counter = meter.create_counter(
name="requests",
description="number of requests",
unit="1",
value_type=int,
)
request_min_max = meter.create_counter(
name="requests_min_max",
description="min max sum count of requests",
unit="1",
value_type=int,
)
request_last_value = meter.create_counter(
name="requests_last_value",
description="last value number of requests",
unit="1",
value_type=int,
)
requests_size = meter.create_valuerecorder(
name="requests_size",
description="size of requests",
unit="1",
value_type=int,
)
requests_size_histogram = meter.create_valuerecorder(
name="requests_size_histogram",
description="histogram of request_size",
unit="1",
value_type=int,
)
requests_active = meter.create_updowncounter(
name="requests_active",
description="number of active requests",
unit="1",
value_type=int,
)
meter.register_sumobserver(
callback=get_ram_usage_callback,
name="ram_usage",
description="ram usage",
unit="1",
value_type=float,
)
meter.register_valueobserver(
callback=get_cpu_usage_callback,
name="cpu_percent",
description="per-cpu usage",
unit="1",
value_type=float,
)
counter_view1 = View(
requests_counter,
SumAggregator,
label_keys=["environment"],
view_config=ViewConfig.LABEL_KEYS,
)
counter_view2 = View(
request_min_max,
MinMaxSumCountAggregator,
label_keys=["os_type"],
view_config=ViewConfig.LABEL_KEYS,
)
counter_view3 = View(
request_last_value,
LastValueAggregator,
label_keys=["environment"],
view_config=ViewConfig.UNGROUPED,
)
size_view = View(
requests_size_histogram,
HistogramAggregator,
label_keys=["environment"],
aggregator_config={"bounds": [20, 40, 60, 80, 100]},
view_config=ViewConfig.UNGROUPED,
)
meter.register_view(counter_view1)
meter.register_view(counter_view2)
meter.register_view(counter_view3)
meter.register_view(size_view)
# Load generator
num = random.randint(0, 1000)
while True:
# counters
requests_counter.add(num % 131 + 200, testing_labels)
request_min_max.add(num % 181 + 200, testing_labels)
request_last_value.add(num % 101 + 200, testing_labels)
# updown counter
requests_active.add(num % 7231 + 200, testing_labels)
# value observers
requests_size.record(num % 6101 + 100, testing_labels)
requests_size_histogram.record(num % 113, testing_labels)
logger.log(level=INFO, msg="completed metrics collection cycle")
time.sleep(1)
num += 9791