简体   繁体   中英

Update ObservableGauge in Open Telemetry Python

I am using opentelemetry-api 1.14 and opentelemetry-sdk 1.14. I know how to create and use Counter and ObservableGauge instruments. However, I need to update and set the gauge throughout my application in a similar manner to how a counter can use its add method. I have working code below but in this working code the gauge is static at 9.

import time
""" API is the interface that you should interact with."""
from opentelemetry import metrics
"""
SDK is the implementation. Only access SDK during initialization, startup, and shutdown.
"""
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader, ConsoleMetricExporter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.resources import Resource

def initialize():
    resource = Resource(attributes={"service.name": "otel-test"})
    readers = []

    # Console Exporter
    exporter = ConsoleMetricExporter() 
    reader1 = PeriodicExportingMetricReader(exporter, export_interval_millis=5000) 
    readers.append(reader1)

    provider = MeterProvider(metric_readers=readers, resource=resource) 
    metrics.set_meter_provider(provider) 

initialize()

provider = metrics.get_meter_provider()
meter =  provider.get_meter("my-demo-meter")

simple_counter = meter.create_counter("simple_counter", description="simply increments each loop")
# Async Gauge
def observable_gauge_func(options):
    yield metrics.Observation(9, {})
simple_gauge = meter.create_observable_gauge("simple_gauge", [observable_gauge_func])

# How can I update simple_gauge in main
def main():
    loop_counter = 0
    while True:
        print(loop_counter)
        loop_counter += 1
        simple_counter.add(1)
        # How can I update simple_gauge here?
        time.sleep(5)

main()

I'm not sure if this is the best pattern for implementing an ObservableGauge instrument but this a method I used to implement it for my application given the requirements described in my question (ie update gauge in main function). Its worth providing given how few examples of ObservableGauge instrumentation there are online.

import time
import random
""" API is the interface that you should interact with."""
from opentelemetry import metrics
"""
SDK is the implementation. Only access SDK during initialization, startup, and shutdown.
"""
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader, ConsoleMetricExporter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.resources import Resource

def initialize():
    resource = Resource(attributes={"service.name": "otel-test"})
    readers = []

    # Console Exporter
    exporter = ConsoleMetricExporter() 
    reader1 = PeriodicExportingMetricReader(exporter, export_interval_millis=5000) 
    readers.append(reader1)

    provider = MeterProvider(metric_readers=readers, resource=resource) 
    metrics.set_meter_provider(provider) 

initialize()

provider = metrics.get_meter_provider()
meter =  provider.get_meter("my-demo-meter")

simple_counter = meter.create_counter("simple_counter", description="simply increments each loop")
def create_simple_gauge(signal):
    # Async Gauge
    def observable_gauge_func(options):
        yield metrics.Observation(signal.get_current_value(), {"simple_attribute": signal.attribute})
    simple_gauge = meter.create_observable_gauge("simple_gauge", [observable_gauge_func])
    return simple_gauge


class Signal:
    def __init__(self, attribute):
        self.attribute = attribute

    def set_current_value(self, i):
        self.current_value = i
    
    def get_current_value(self):
        return self.current_value

# How can I update the simple_gauge here?
def main():
    loop_counter = 0
    simple_signal = Signal("simple_attribute")
    create_simple_gauge(simple_signal)
    while True:
        print(loop_counter)
        loop_counter += 1
        simple_counter.add(1)

        randint = random.randint(0, 5)
        print(randint)
        simple_signal.set_current_value(randint)

        time.sleep(5)

main()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM