diff --git a/.flake8 b/.flake8 index d0e523dbc3..4f8ad34d62 100644 --- a/.flake8 +++ b/.flake8 @@ -19,7 +19,6 @@ exclude = __pycache__ exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/gen/ exporter/opentelemetry-exporter-jaeger/build/* - exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen docs/examples/opentelemetry-example-app/src/opentelemetry_example_app/grpc/gen/ docs/examples/opentelemetry-example-app/build/* opentelemetry-python-core/ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a6fe990f0e..80024d3450 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ on: - 'release/*' pull_request: env: - CORE_REPO_SHA: 48efb9737b037b7fb85ecafdf0f3dccd45d96af8 + CORE_REPO_SHA: e71106fd8e5fe5ae11c5b393c2da3cda05cd55c2 jobs: build: diff --git a/.pylintrc b/.pylintrc index 22720cf232..8a211df8f0 100644 --- a/.pylintrc +++ b/.pylintrc @@ -7,7 +7,7 @@ extension-pkg-whitelist= # Add list of files or directories to be excluded. They should be base names, not # paths. -ignore=CVS,gen,Dockerfile,docker-compose.yml,README.md,requirements.txt,cortex-config.yml +ignore=CVS,gen,Dockerfile,docker-compose.yml,README.md,requirements.txt # Add files or directories matching the regex patterns to be excluded. The # regex matches against base names, not paths. diff --git a/CHANGELOG.md b/CHANGELOG.md index 58b2fe944e..11ed3dc1b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#301](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/301)) - `opentelemetry-instrumentation-asgi` Return header values using case insensitive keys ([#308](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/308)) +- Remove metrics from all instrumentations + ([#312](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/312)) ## [0.17b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.17b0) - 2021-01-20 diff --git a/docs/instrumentation/system_metrics/system_metrics.rst b/docs/instrumentation/system_metrics/system_metrics.rst deleted file mode 100644 index 96b39d9267..0000000000 --- a/docs/instrumentation/system_metrics/system_metrics.rst +++ /dev/null @@ -1,7 +0,0 @@ -OpenTelemetry System Metrics Instrumentation -============================================ - -.. automodule:: opentelemetry.instrumentation.system_metrics - :members: - :undoc-members: - :show-inheritance: diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/README.rst b/exporter/opentelemetry-exporter-prometheus-remote-write/README.rst deleted file mode 100644 index 1f5dc01404..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/README.rst +++ /dev/null @@ -1,322 +0,0 @@ -OpenTelemetry Prometheus Remote Write Exporter -========================================================= - -This package contains an exporter to send `OTLP`_ metrics from the -`OpenTelemetry Python SDK`_ directly to a `Prometheus Remote Write integrated backend`_ -(such as Cortex or Thanos) without having to run an instance of the -Prometheus server. The latest `types.proto`_ and `remote.proto`_ -protocol buffers are used to create the WriteRequest. The image below shows the -two Prometheus exporters in the OpenTelemetry Python SDK. - -Pipeline 1 illustrates the setup required for a `Prometheus "pull" exporter`_. - -Pipeline 2 illustrates the setup required for the Prometheus Remote -Write exporter. - -|Prometheus SDK pipelines| - -The Prometheus Remote Write Exporter is a "push" based exporter and only -works with the OpenTelemetry `push controller`_. The controller -periodically collects data and passes it to the exporter. This exporter -then converts the data into `timeseries`_ and sends it to the Remote -Write integrated backend through HTTP POST requests. The metrics -collection datapath is shown below: - - -See the ``examples`` folder for a demo usage of this exporter - -Table of Contents -================= - -- `Summary`_ -- `Table of Contents`_ - - - `Installation`_ - - `Quickstart`_ - - `Examples`_ - - `Configuring the Exporter`_ - - `Securing the Exporter`_ - - - `Authentication`_ - - `TLS`_ - - - `Supported Aggregators`_ - - `Error Handling`_ - - `Contributing`_ - - - `Design Doc`_ - -Installation ------------- -Prerequisites -~~~~~~~~~~~~~ -1. Install the snappy c-library - **DEB**: ``sudo apt-get install libsnappy-dev`` - - **RPM**: ``sudo yum install libsnappy-devel`` - - **OSX/Brew**: ``brew install snappy`` - - **Windows**: ``pip install python_snappy-0.5-cp36-cp36m-win_amd64.whl`` - -Exporter -~~~~~~~~ - -- To install from the latest PyPi release, run - ``pip install opentelemetry-exporter-prometheus-remote-write`` - - -Quickstart ----------- - -.. code:: python - - from opentelemetry import metrics - from opentelemetry.sdk.metrics import MeterProvider - from opentelemetry.exporter.prometheus_remote_write import ( - PrometheusRemoteWriteMetricsExporter - ) - - # Sets the global MeterProvider instance - metrics.set_meter_provider(MeterProvider()) - - # The Meter is responsible for creating and recording metrics. Each meter has a unique name, which we set as the module's name here. - meter = metrics.get_meter(__name__) - - exporter = PrometheusRemoteWriteMetricsExporter(endpoint="endpoint_here") # add other params as needed - - metrics.get_meter_provider().start_pipeline(meter, exporter, 5) - - -Examples --------- - -This example uses `Docker Compose`_ to set up: - -1. A Python program that creates 5 instruments with 5 unique aggregators - and a randomized load generator -2. An instance of `Cortex`_ to recieve the metrics data -3. An instance of `Grafana`_ to visualizse the exported data - -Requirements -~~~~~~~~~~~~ - -- Have Docker Compose `installed`_ - -*Users do not need to install Python as the app will be run in the -Docker Container* - -Instructions -~~~~~~~~~~~~ - -1. Run ``docker-compose up -d`` in the the ``examples/`` directory - -The ``-d`` flag causes all services to run in detached mode and frees up -your terminal session. This also causes no logs to show up. Users can -attach themselves to the service’s logs manually using -``docker logs ${CONTAINER_ID} --follow`` - -2. Log into the Grafana instance at http://localhost:3000 - - - login credentials are ``username: admin`` and ``password: admin`` - - There may be an additional screen on setting a new password. This - can be skipped and is optional - -3. Navigate to the ``Data Sources`` page - - - Look for a gear icon on the left sidebar and select - ``Data Sources`` - -4. Add a new Prometheus Data Source - - - Use ``http://cortex:9009/api/prom`` as the URL - - Set the scrape interval to ``2s`` to make updates - appear quickly **(Optional)** - - click ``Save & Test`` - -5. Go to ``Metrics Explore`` to query metrics - - - Look for a compass icon on the left sidebar - - click ``Metrics`` for a dropdown list of all the available metrics - - Adjust time range by clicking the ``Last 6 hours`` - button on the upper right side of the graph **(Optional)** - - Set up auto-refresh by selecting an option under the - dropdown next to the refresh button on the upper right side of the - graph **(Optional)** - - Click the refresh button and data should show up on hte graph - -6. Shutdown the services when finished - - - Run ``docker-compose down`` in the examples directory - -Configuring the Exporter ------------------------- - -The exporter can be configured through parameters passed to the -constructor. Here are all the options: - -- ``endpoint``: url where data will be sent **(Required)** -- ``basic_auth``: username and password for authentication - **(Optional)** -- ``headers``: additional headers for remote write request as - determined by the remote write backend's API **(Optional)** -- ``timeout``: timeout for requests to the remote write endpoint in - seconds **(Optional)** -- ``proxies``: dict mapping request proxy protocols to proxy urls - **(Optional)** -- ``tls_config``: configuration for remote write TLS settings - **(Optional)** - -Example with all the configuration options: - -.. code:: python - - exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="http://localhost:9009/api/prom/push", - timeout=30, - basic_auth={ - "username": "user", - "password": "pass123", - }, - headers={ - "X-Scope-Org-ID": "5", - "Authorization": "Bearer mytoken123", - }, - proxies={ - "http": "http://10.10.1.10:3000", - "https": "http://10.10.1.10:1080", - }, - tls_config={ - "cert_file": "path/to/file", - "key_file": "path/to/file", - "ca_file": "path_to_file", - "insecure_skip_verify": true, # for developing purposes - } - ) - -Securing the Exporter ---------------------- - -Authentication -~~~~~~~~~~~~~~ - -The exporter provides two forms of authentication which are shown below. -Users can add their own custom authentication by setting the appropriate -values in the ``headers`` dictionary - -1. Basic Authentication Basic authentication sets a HTTP Authorization - header containing a base64 encoded username/password pair. See `RFC - 7617`_ for more information. This - -.. code:: python - - exporter = PrometheusRemoteWriteMetricsExporter( - basic_auth={"username": "base64user", "password": "base64pass"} - ) - -2. Bearer Token Authentication This custom configuration can be achieved - by passing in a custom ``header`` to the constructor. See `RFC 6750`_ - for more information. - -.. code:: python - - header = { - "Authorization": "Bearer mytoken123" - } - -TLS -~~~ - -Users can add TLS to the exporter's HTTP Client by providing certificate -and key files in the ``tls_config`` parameter. - -Supported Aggregators ---------------------- -Behaviour of these aggregators is outlined in the `OpenTelemetry Specification `_. -All aggregators are converted into the `timeseries`_ data format. However, method in -which they are converted `differs `_ from aggregator to aggregator. A -map of the conversion methods can be found `here `_. - -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ -| **OpenTelemetry Aggregator** | **Equivalent Prometheus Data Type** | **Behaviour** | -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ -| Sum | Counter | Metric value can only go up or be reset to 0 | -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ -| MinMaxSumCount | Gauge | Metric value can arbitrarily increment or decrement | -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ -| Histogram | Histogram | Unlike the Prometheus histogram, the OpenTelemetry Histogram does not provide a sum of all observed values | -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ -| LastValue | N/A | Metric only contains the most recently observed value | -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ -| ValueObserver | N/A | Similar to MinMaxSumCount but also contains LastValue | -+------------------------------+-------------------------------------+------------------------------------------------------------------------------------------------------------+ - - -Error Handling --------------- - -In general, errors are raised by the calling function. The exception is -for failed requests where any error status code is logged as a warning -instead. - -This is because the exporter does not implement any retry logic as data that -failed to export will be dropped. - -For example, consider a situation where a user increments a Counter -instrument 5 times and an export happens between each increment. If the -exports happen like so: - -:: - - SUCCESS FAIL FAIL SUCCESS SUCCESS - 1 2 3 4 5 - -Then the received data will be: - -:: - - 1 4 5 - -Contributing ------------- - -If you would like to learn more about the exporter's structure and -design decisions please view the design document below - -Design Doc -~~~~~~~~~~ - -`Design Document`_ - -This document is stored elsewhere as it contains large images which will -significantly increase the size of this repo. - -.. _Summary: #opentelemetry-python-sdk-prometheus-remote-write-exporter -.. _Table of Contents: #table-of-contents -.. _Installation: #installation -.. _Quickstart: #quickstart -.. _Examples: #examples -.. _Configuring the Exporter: #configuring-the-exporter -.. _Securing the Exporter: #securing-the-exporter -.. _Authentication: #authentication -.. _TLS: #tls -.. _Supported Aggregators: #supported-aggregators -.. _Error Handling: #error-handling -.. _Contributing: #contributing -.. _Design Doc: #design-doc -.. |Prometheus SDK pipelines| image:: https://user-images.githubusercontent.com/20804975/100285430-e320fd80-2f3e-11eb-8217-a562c559153c.png -.. _RFC 7617: https://tools.ietf.org/html/rfc7617 -.. _RFC 6750: https://tools.ietf.org/html/rfc6750 -.. _Design Document: https://github.com/open-o11y/docs/blob/master/python-prometheus-remote-write/design-doc.md -.. _OTLP: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md -.. _OpenTelemetry Python SDK: https://github.com/open-telemetry/opentelemetry-python -.. _Prometheus "pull" exporter: https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-prometheus -.. _Prometheus Remote Write integrated backend: https://prometheus.io/docs/operating/integrations/ -.. _types.proto: https://github.com/prometheus/prometheus/blob/master/prompb/types.proto -.. _remote.proto: https://github.com/prometheus/prometheus/blob/master/prompb/remote.proto -.. _push controller: https://github.com/open-telemetry/opentelemetry-python/blob/main/opentelemetry-sdk/src/opentelemetry/sdk/metrics/export/controller.py#L22 -.. _timeseries: https://prometheus.io/docs/concepts/data_model/ -.. _Docker Compose: https://docs.docker.com/compose/ -.. _Cortex: https://cortexmetrics.io/ -.. _Grafana: https://grafana.com/ -.. _installed: https://docs.docker.com/compose/install/ diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/Dockerfile b/exporter/opentelemetry-exporter-prometheus-remote-write/examples/Dockerfile deleted file mode 100644 index 09ce8cc323..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM python:3.7 -WORKDIR /code - -COPY . . -RUN apt-get update -y && apt-get install libsnappy-dev -y -RUN pip install -e . -RUN pip install -r ./examples/requirements.txt -CMD ["python", "./examples/sampleapp.py"] diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/README.md b/exporter/opentelemetry-exporter-prometheus-remote-write/examples/README.md deleted file mode 100644 index 91f7ead578..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Prometheus Remote Write Exporter Example -This example uses [Docker Compose](https://docs.docker.com/compose/) to set up: - -1. A Python program that creates 5 instruments with 5 unique -aggregators and a randomized load generator -2. An instance of [Cortex](https://cortexmetrics.io/) to recieve the metrics -data -3. An instance of [Grafana](https://grafana.com/) to visualizse the exported -data - -## Requirements -* Have Docker Compose [installed](https://docs.docker.com/compose/install/) - -*Users do not need to install Python as the app will be run in the Docker Container* - -## Instructions -1. Run `docker-compose up -d` in the the `examples/` directory - -The `-d` flag causes all services to run in detached mode and frees up your -terminal session. This also causes no logs to show up. Users can attach themselves to the service's logs manually using `docker logs ${CONTAINER_ID} --follow` - -2. Log into the Grafana instance at [http://localhost:3000](http://localhost:3000) - * login credentials are `username: admin` and `password: admin` - * There may be an additional screen on setting a new password. This can be skipped and is optional - -3. Navigate to the `Data Sources` page - * Look for a gear icon on the left sidebar and select `Data Sources` - -4. Add a new Prometheus Data Source - * Use `http://cortex:9009/api/prom` as the URL - * (OPTIONAl) set the scrape interval to `2s` to make updates appear quickly - * click `Save & Test` - -5. Go to `Metrics Explore` to query metrics - * Look for a compass icon on the left sidebar - * click `Metrics` for a dropdown list of all the available metrics - * (OPTIONAL) Adjust time range by clicking the `Last 6 hours` button on the upper right side of the graph - * (OPTIONAL) Set up auto-refresh by selecting an option under the dropdown next to the refresh button on the upper right side of the graph - * Click the refresh button and data should show up on hte graph - -6. Shutdown the services when finished - * Run `docker-compose down` in the examples directory \ No newline at end of file diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/cortex-config.yml b/exporter/opentelemetry-exporter-prometheus-remote-write/examples/cortex-config.yml deleted file mode 100644 index 37bd6473d6..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/cortex-config.yml +++ /dev/null @@ -1,100 +0,0 @@ -# This Cortex Config is copied from the Cortex Project documentation -# Source: https://github.com/cortexproject/cortex/blob/master/docs/configuration/single-process-config.yaml - -# Configuration for running Cortex in single-process mode. -# This configuration should not be used in production. -# It is only for getting started and development. - -# Disable the requirement that every request to Cortex has a -# X-Scope-OrgID header. `fake` will be substituted in instead. -auth_enabled: false - -server: - http_listen_port: 9009 - - # Configure the server to allow messages up to 100MB. - grpc_server_max_recv_msg_size: 104857600 - grpc_server_max_send_msg_size: 104857600 - grpc_server_max_concurrent_streams: 1000 - -distributor: - shard_by_all_labels: true - pool: - health_check_ingesters: true - -ingester_client: - grpc_client_config: - # Configure the client to allow messages up to 100MB. - max_recv_msg_size: 104857600 - max_send_msg_size: 104857600 - use_gzip_compression: true - -ingester: - # We want our ingesters to flush chunks at the same time to optimise - # deduplication opportunities. - spread_flushes: true - chunk_age_jitter: 0 - - walconfig: - wal_enabled: true - recover_from_wal: true - wal_dir: /tmp/cortex/wal - - lifecycler: - # The address to advertise for this ingester. Will be autodiscovered by - # looking up address on eth0 or en0; can be specified if this fails. - # address: 127.0.0.1 - - # We want to start immediately and flush on shutdown. - join_after: 0 - min_ready_duration: 0s - final_sleep: 0s - num_tokens: 512 - tokens_file_path: /tmp/cortex/wal/tokens - - # Use an in memory ring store, so we don't need to launch a Consul. - ring: - kvstore: - store: inmemory - replication_factor: 1 - -# Use local storage - BoltDB for the index, and the filesystem -# for the chunks. -schema: - configs: - - from: 2019-07-29 - store: boltdb - object_store: filesystem - schema: v10 - index: - prefix: index_ - period: 1w - -storage: - boltdb: - directory: /tmp/cortex/index - - filesystem: - directory: /tmp/cortex/chunks - - delete_store: - store: boltdb - -purger: - object_store_type: filesystem - -frontend_worker: - # Configure the frontend worker in the querier to match worker count - # to max_concurrent on the queriers. - match_max_concurrent: true - -# Configure the ruler to scan the /tmp/cortex/rules directory for prometheus -# rules: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#recording-rules -ruler: - enable_api: true - enable_sharding: false - storage: - type: local - local: - directory: /tmp/cortex/rules - diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/docker-compose.yml b/exporter/opentelemetry-exporter-prometheus-remote-write/examples/docker-compose.yml deleted file mode 100644 index 61e6f4981e..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/docker-compose.yml +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -version: "3.8" - -services: - cortex: - image: quay.io/cortexproject/cortex:v1.5.0 - command: - - -config.file=./config/cortex-config.yml - volumes: - - ./cortex-config.yml:/config/cortex-config.yml:ro - ports: - - 9009:9009 - grafana: - image: grafana/grafana:latest - ports: - - 3000:3000 - sample_app: - build: - context: ../ - dockerfile: ./examples/Dockerfile diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/requirements.txt b/exporter/opentelemetry-exporter-prometheus-remote-write/examples/requirements.txt deleted file mode 100644 index f049aac258..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -psutil -protobuf>=3.13.0 -requests>=2.25.0 -python-snappy>=0.5.4 -opentelemetry-api -opentelemetry-sdk -opentelemetry-proto diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/sampleapp.py b/exporter/opentelemetry-exporter-prometheus-remote-write/examples/sampleapp.py deleted file mode 100644 index 69f7a068ea..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/examples/sampleapp.py +++ /dev/null @@ -1,153 +0,0 @@ -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 diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg b/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg deleted file mode 100644 index 53afd484df..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -[metadata] -name = opentelemetry-exporter-prometheus-remote-write -description = Prometheus Remote Write Metrics Exporter for OpenTelemetry -long_description = file: README.rst -long_description_content_type = text/x-rst -author = OpenTelemetry Authors -author_email = cncf-opentelemetry-contributors@lists.cncf.io -url = https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/exporter/opentelemetry-exporter-prometheus-remote-write -platforms = any -license = Apache-2.0 -classifiers = - Development Status :: 4 - Beta - Intended Audience :: Developers - License :: OSI Approved :: Apache Software License - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.5 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - -[options] -python_requires = >=3.5 -package_dir= - =src -packages=find_namespace: -install_requires = - snappy >= 2.8 - protobuf >= 3.13.0 - requests == 2.25.0 - opentelemetry-api == 0.18.dev0 - opentelemetry-sdk == 0.18.dev0 - python-snappy >= 0.5.4 - -[options.packages.find] -where = src \ No newline at end of file diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/setup.py b/exporter/opentelemetry-exporter-prometheus-remote-write/setup.py deleted file mode 100644 index b2d9a5a47c..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/setup.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -import setuptools - -BASE_DIR = os.path.dirname(__file__) -VERSION_FILENAME = os.path.join( - BASE_DIR, - "src", - "opentelemetry", - "exporter", - "prometheus_remote_write", - "version.py", -) -PACKAGE_INFO = {} -with open(VERSION_FILENAME) as f: - exec(f.read(), PACKAGE_INFO) - -setuptools.setup(version=PACKAGE_INFO["__version__"]) diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py deleted file mode 100644 index 1a75ea80c3..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py +++ /dev/null @@ -1,377 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import re -from typing import Dict, Sequence - -import requests -import snappy - -from opentelemetry.exporter.prometheus_remote_write.gen.remote_pb2 import ( - WriteRequest, -) -from opentelemetry.exporter.prometheus_remote_write.gen.types_pb2 import ( - Label, - Sample, - TimeSeries, -) -from opentelemetry.sdk.metrics.export import ( - ExportRecord, - MetricsExporter, - MetricsExportResult, -) -from opentelemetry.sdk.metrics.export.aggregate import ( - HistogramAggregator, - LastValueAggregator, - MinMaxSumCountAggregator, - SumAggregator, - ValueObserverAggregator, -) - -logger = logging.getLogger(__name__) - - -class PrometheusRemoteWriteMetricsExporter(MetricsExporter): - """ - Prometheus remote write metric exporter for OpenTelemetry. - - Args: - endpoint: url where data will be sent (Required) - basic_auth: username and password for authentication (Optional) - headers: additional headers for remote write request (Optional) - timeout: timeout for remote write requests in seconds, defaults to 30 (Optional) - proxies: dict mapping request proxy protocols to proxy urls (Optional) - tls_config: configuration for remote write TLS settings (Optional) - """ - - def __init__( - self, - endpoint: str, - basic_auth: Dict = None, - headers: Dict = None, - timeout: int = 30, - tls_config: Dict = None, - proxies: Dict = None, - ): - self.endpoint = endpoint - self.basic_auth = basic_auth - self.headers = headers - self.timeout = timeout - self.tls_config = tls_config - self.proxies = proxies - - self.converter_map = { - MinMaxSumCountAggregator: self._convert_from_min_max_sum_count, - SumAggregator: self._convert_from_sum, - HistogramAggregator: self._convert_from_histogram, - LastValueAggregator: self._convert_from_last_value, - ValueObserverAggregator: self._convert_from_value_observer, - } - - @property - def endpoint(self): - return self._endpoint - - @endpoint.setter - def endpoint(self, endpoint: str): - if endpoint == "": - raise ValueError("endpoint required") - self._endpoint = endpoint - - @property - def basic_auth(self): - return self._basic_auth - - @basic_auth.setter - def basic_auth(self, basic_auth: Dict): - if basic_auth: - if "username" not in basic_auth: - raise ValueError("username required in basic_auth") - if "password_file" in basic_auth: - if "password" in basic_auth: - raise ValueError( - "basic_auth cannot contain password and password_file" - ) - with open(basic_auth["password_file"]) as file: - basic_auth["password"] = file.readline().strip() - elif "password" not in basic_auth: - raise ValueError("password required in basic_auth") - self._basic_auth = basic_auth - - @property - def timeout(self): - return self._timeout - - @timeout.setter - def timeout(self, timeout: int): - if timeout <= 0: - raise ValueError("timeout must be greater than 0") - self._timeout = timeout - - @property - def tls_config(self): - return self._tls_config - - @tls_config.setter - def tls_config(self, tls_config: Dict): - if tls_config: - new_config = {} - if "ca_file" in tls_config: - new_config["ca_file"] = tls_config["ca_file"] - if "cert_file" in tls_config and "key_file" in tls_config: - new_config["cert_file"] = tls_config["cert_file"] - new_config["key_file"] = tls_config["key_file"] - elif "cert_file" in tls_config or "key_file" in tls_config: - raise ValueError( - "tls_config requires both cert_file and key_file" - ) - if "insecure_skip_verify" in tls_config: - new_config["insecure_skip_verify"] = tls_config[ - "insecure_skip_verify" - ] - self._tls_config = tls_config - - @property - def proxies(self): - return self._proxies - - @proxies.setter - def proxies(self, proxies: Dict): - self._proxies = proxies - - @property - def headers(self): - return self._headers - - @headers.setter - def headers(self, headers: Dict): - self._headers = headers - - def export( - self, export_records: Sequence[ExportRecord] - ) -> MetricsExportResult: - if not export_records: - return MetricsExportResult.SUCCESS - timeseries = self._convert_to_timeseries(export_records) - if not timeseries: - logger.error( - "All records contain unsupported aggregators, export aborted" - ) - return MetricsExportResult.FAILURE - message = self._build_message(timeseries) - headers = self._build_headers() - return self._send_message(message, headers) - - def shutdown(self) -> None: - pass - - def _convert_to_timeseries( - self, export_records: Sequence[ExportRecord] - ) -> Sequence[TimeSeries]: - timeseries = [] - for export_record in export_records: - aggregator_type = type(export_record.aggregator) - converter = self.converter_map.get(aggregator_type) - if converter: - timeseries.extend(converter(export_record)) - else: - logger.warning( - "%s aggregator is not supported, record dropped", - aggregator_type, - ) - return timeseries - - def _convert_from_sum( - self, sum_record: ExportRecord - ) -> Sequence[TimeSeries]: - return [ - self._create_timeseries( - sum_record, - sum_record.instrument.name + "_sum", - sum_record.aggregator.checkpoint, - ) - ] - - def _convert_from_min_max_sum_count( - self, min_max_sum_count_record: ExportRecord - ) -> Sequence[TimeSeries]: - timeseries = [] - for agg_type in ["min", "max", "sum", "count"]: - name = min_max_sum_count_record.instrument.name + "_" + agg_type - value = getattr( - min_max_sum_count_record.aggregator.checkpoint, agg_type - ) - timeseries.append( - self._create_timeseries(min_max_sum_count_record, name, value) - ) - return timeseries - - def _convert_from_histogram( - self, histogram_record: ExportRecord - ) -> Sequence[TimeSeries]: - timeseries = [] - for bound in histogram_record.aggregator.checkpoint.keys(): - bound_str = "+Inf" if bound == float("inf") else str(bound) - value = histogram_record.aggregator.checkpoint[bound] - timeseries.append( - self._create_timeseries( - histogram_record, - histogram_record.instrument.name + "_histogram", - value, - extra_label=("le", bound_str), - ) - ) - return timeseries - - def _convert_from_last_value( - self, last_value_record: ExportRecord - ) -> Sequence[TimeSeries]: - return [ - self._create_timeseries( - last_value_record, - last_value_record.instrument.name + "_last", - last_value_record.aggregator.checkpoint, - ) - ] - - def _convert_from_value_observer( - self, value_observer_record: ExportRecord - ) -> Sequence[TimeSeries]: - timeseries = [] - for agg_type in ["min", "max", "sum", "count", "last"]: - timeseries.append( - self._create_timeseries( - value_observer_record, - value_observer_record.instrument.name + "_" + agg_type, - getattr( - value_observer_record.aggregator.checkpoint, agg_type - ), - ) - ) - return timeseries - - # TODO: Implement convert from quantile once supported by SDK for Prometheus Summaries - def _convert_from_quantile( - self, summary_record: ExportRecord - ) -> Sequence[TimeSeries]: - raise NotImplementedError() - - # pylint: disable=no-member,no-self-use - def _create_timeseries( - self, - export_record: ExportRecord, - name: str, - value: float, - extra_label: (str, str) = None, - ) -> TimeSeries: - timeseries = TimeSeries() - seen = set() - - def add_label(label_name: str, label_value: str): - # Label name must contain only alphanumeric characters and underscores - label_name = re.sub("[^\\w_]", "_", label_name) - if label_name not in seen: - label = Label() - label.name = label_name - label.value = label_value - timeseries.labels.append(label) - seen.add(label_name) - else: - logger.warning( - "Duplicate label with name %s and value %s", - label_name, - label_value, - ) - - # The __name__ label is required by PromQL as its value appears as the metric_name - add_label("__name__", name) - if extra_label: - add_label(extra_label[0], extra_label[1]) - if export_record.resource.attributes: - for ( - label_name, - label_value, - ) in export_record.resource.attributes.items(): - add_label(label_name, str(label_value)) - if export_record.labels: - for [label_name, label_value] in export_record.labels: - add_label(label_name, label_value) - - sample = Sample() - sample.timestamp = int( - export_record.aggregator.last_update_timestamp / 1000000 - ) - sample.value = value - timeseries.samples.append(sample) - return timeseries - - # pylint: disable=no-member,no-self-use - def _build_message(self, timeseries: Sequence[TimeSeries]) -> bytes: - write_request = WriteRequest() - write_request.timeseries.extend(timeseries) - serialized_message = write_request.SerializeToString() - return snappy.compress(serialized_message) - - def _build_headers(self) -> Dict: - headers = { - "Content-Encoding": "snappy", - "Content-Type": "application/x-protobuf", - "X-Prometheus-Remote-Write-Version": "0.1.0", - } - if self.headers: - for header_name, header_value in self.headers.items(): - headers[header_name] = header_value - return headers - - def _send_message( - self, message: bytes, headers: Dict - ) -> MetricsExportResult: - auth = None - if self.basic_auth: - auth = (self.basic_auth["username"], self.basic_auth["password"]) - - cert = None - verify = True - if self.tls_config: - if "ca_file" in self.tls_config: - verify = self.tls_config["ca_file"] - elif "insecure_skip_verify" in self.tls_config: - verify = self.tls_config["insecure_skip_verify"] - - if ( - "cert_file" in self.tls_config - and "key_file" in self.tls_config - ): - cert = ( - self.tls_config["cert_file"], - self.tls_config["key_file"], - ) - try: - response = requests.post( - self.endpoint, - data=message, - headers=headers, - auth=auth, - timeout=self.timeout, - proxies=self.proxies, - cert=cert, - verify=verify, - ) - if not response.ok: - response.raise_for_status() - except requests.exceptions.RequestException as err: - logger.error("Export POST request failed with reason: %s", err) - return MetricsExportResult.FAILURE - return MetricsExportResult.SUCCESS diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/gogoproto/gogo.proto b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/gogoproto/gogo.proto deleted file mode 100644 index 6d2137f4a5..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/gogoproto/gogo.proto +++ /dev/null @@ -1,145 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto2"; -package gogoproto; - -import "google/protobuf/descriptor.proto"; - -option java_package = "com.google.protobuf"; -option java_outer_classname = "GoGoProtos"; -option go_package = "github.com/gogo/protobuf/gogoproto"; - -extend google.protobuf.EnumOptions { - optional bool goproto_enum_prefix = 62001; - optional bool goproto_enum_stringer = 62021; - optional bool enum_stringer = 62022; - optional string enum_customname = 62023; - optional bool enumdecl = 62024; -} - -extend google.protobuf.EnumValueOptions { - optional string enumvalue_customname = 66001; -} - -extend google.protobuf.FileOptions { - optional bool goproto_getters_all = 63001; - optional bool goproto_enum_prefix_all = 63002; - optional bool goproto_stringer_all = 63003; - optional bool verbose_equal_all = 63004; - optional bool face_all = 63005; - optional bool gostring_all = 63006; - optional bool populate_all = 63007; - optional bool stringer_all = 63008; - optional bool onlyone_all = 63009; - - optional bool equal_all = 63013; - optional bool description_all = 63014; - optional bool testgen_all = 63015; - optional bool benchgen_all = 63016; - optional bool marshaler_all = 63017; - optional bool unmarshaler_all = 63018; - optional bool stable_marshaler_all = 63019; - - optional bool sizer_all = 63020; - - optional bool goproto_enum_stringer_all = 63021; - optional bool enum_stringer_all = 63022; - - optional bool unsafe_marshaler_all = 63023; - optional bool unsafe_unmarshaler_all = 63024; - - optional bool goproto_extensions_map_all = 63025; - optional bool goproto_unrecognized_all = 63026; - optional bool gogoproto_import = 63027; - optional bool protosizer_all = 63028; - optional bool compare_all = 63029; - optional bool typedecl_all = 63030; - optional bool enumdecl_all = 63031; - - optional bool goproto_registration = 63032; - optional bool messagename_all = 63033; - - optional bool goproto_sizecache_all = 63034; - optional bool goproto_unkeyed_all = 63035; -} - -extend google.protobuf.MessageOptions { - optional bool goproto_getters = 64001; - optional bool goproto_stringer = 64003; - optional bool verbose_equal = 64004; - optional bool face = 64005; - optional bool gostring = 64006; - optional bool populate = 64007; - optional bool stringer = 67008; - optional bool onlyone = 64009; - - optional bool equal = 64013; - optional bool description = 64014; - optional bool testgen = 64015; - optional bool benchgen = 64016; - optional bool marshaler = 64017; - optional bool unmarshaler = 64018; - optional bool stable_marshaler = 64019; - - optional bool sizer = 64020; - - optional bool unsafe_marshaler = 64023; - optional bool unsafe_unmarshaler = 64024; - - optional bool goproto_extensions_map = 64025; - optional bool goproto_unrecognized = 64026; - - optional bool protosizer = 64028; - optional bool compare = 64029; - - optional bool typedecl = 64030; - - optional bool messagename = 64033; - - optional bool goproto_sizecache = 64034; - optional bool goproto_unkeyed = 64035; -} - -extend google.protobuf.FieldOptions { - optional bool nullable = 65001; - optional bool embed = 65002; - optional string customtype = 65003; - optional string customname = 65004; - optional string jsontag = 65005; - optional string moretags = 65006; - optional string casttype = 65007; - optional string castkey = 65008; - optional string castvalue = 65009; - - optional bool stdtime = 65010; - optional bool stdduration = 65011; - optional bool wktpointer = 65012; - -} - diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/gogoproto/gogo_pb2.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/gogoproto/gogo_pb2.py deleted file mode 100644 index fc3401cfad..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/gogoproto/gogo_pb2.py +++ /dev/null @@ -1,793 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: gogoproto/gogo.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='gogoproto/gogo.proto', - package='gogoproto', - syntax='proto2', - serialized_options=b'\n\023com.google.protobufB\nGoGoProtosZ\"github.com/gogo/protobuf/gogoproto', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x14gogoproto/gogo.proto\x12\tgogoproto\x1a google/protobuf/descriptor.proto:;\n\x13goproto_enum_prefix\x12\x1c.google.protobuf.EnumOptions\x18\xb1\xe4\x03 \x01(\x08:=\n\x15goproto_enum_stringer\x12\x1c.google.protobuf.EnumOptions\x18\xc5\xe4\x03 \x01(\x08:5\n\renum_stringer\x12\x1c.google.protobuf.EnumOptions\x18\xc6\xe4\x03 \x01(\x08:7\n\x0f\x65num_customname\x12\x1c.google.protobuf.EnumOptions\x18\xc7\xe4\x03 \x01(\t:0\n\x08\x65numdecl\x12\x1c.google.protobuf.EnumOptions\x18\xc8\xe4\x03 \x01(\x08:A\n\x14\x65numvalue_customname\x12!.google.protobuf.EnumValueOptions\x18\xd1\x83\x04 \x01(\t:;\n\x13goproto_getters_all\x12\x1c.google.protobuf.FileOptions\x18\x99\xec\x03 \x01(\x08:?\n\x17goproto_enum_prefix_all\x12\x1c.google.protobuf.FileOptions\x18\x9a\xec\x03 \x01(\x08:<\n\x14goproto_stringer_all\x12\x1c.google.protobuf.FileOptions\x18\x9b\xec\x03 \x01(\x08:9\n\x11verbose_equal_all\x12\x1c.google.protobuf.FileOptions\x18\x9c\xec\x03 \x01(\x08:0\n\x08\x66\x61\x63\x65_all\x12\x1c.google.protobuf.FileOptions\x18\x9d\xec\x03 \x01(\x08:4\n\x0cgostring_all\x12\x1c.google.protobuf.FileOptions\x18\x9e\xec\x03 \x01(\x08:4\n\x0cpopulate_all\x12\x1c.google.protobuf.FileOptions\x18\x9f\xec\x03 \x01(\x08:4\n\x0cstringer_all\x12\x1c.google.protobuf.FileOptions\x18\xa0\xec\x03 \x01(\x08:3\n\x0bonlyone_all\x12\x1c.google.protobuf.FileOptions\x18\xa1\xec\x03 \x01(\x08:1\n\tequal_all\x12\x1c.google.protobuf.FileOptions\x18\xa5\xec\x03 \x01(\x08:7\n\x0f\x64\x65scription_all\x12\x1c.google.protobuf.FileOptions\x18\xa6\xec\x03 \x01(\x08:3\n\x0btestgen_all\x12\x1c.google.protobuf.FileOptions\x18\xa7\xec\x03 \x01(\x08:4\n\x0c\x62\x65nchgen_all\x12\x1c.google.protobuf.FileOptions\x18\xa8\xec\x03 \x01(\x08:5\n\rmarshaler_all\x12\x1c.google.protobuf.FileOptions\x18\xa9\xec\x03 \x01(\x08:7\n\x0funmarshaler_all\x12\x1c.google.protobuf.FileOptions\x18\xaa\xec\x03 \x01(\x08:<\n\x14stable_marshaler_all\x12\x1c.google.protobuf.FileOptions\x18\xab\xec\x03 \x01(\x08:1\n\tsizer_all\x12\x1c.google.protobuf.FileOptions\x18\xac\xec\x03 \x01(\x08:A\n\x19goproto_enum_stringer_all\x12\x1c.google.protobuf.FileOptions\x18\xad\xec\x03 \x01(\x08:9\n\x11\x65num_stringer_all\x12\x1c.google.protobuf.FileOptions\x18\xae\xec\x03 \x01(\x08:<\n\x14unsafe_marshaler_all\x12\x1c.google.protobuf.FileOptions\x18\xaf\xec\x03 \x01(\x08:>\n\x16unsafe_unmarshaler_all\x12\x1c.google.protobuf.FileOptions\x18\xb0\xec\x03 \x01(\x08:B\n\x1agoproto_extensions_map_all\x12\x1c.google.protobuf.FileOptions\x18\xb1\xec\x03 \x01(\x08:@\n\x18goproto_unrecognized_all\x12\x1c.google.protobuf.FileOptions\x18\xb2\xec\x03 \x01(\x08:8\n\x10gogoproto_import\x12\x1c.google.protobuf.FileOptions\x18\xb3\xec\x03 \x01(\x08:6\n\x0eprotosizer_all\x12\x1c.google.protobuf.FileOptions\x18\xb4\xec\x03 \x01(\x08:3\n\x0b\x63ompare_all\x12\x1c.google.protobuf.FileOptions\x18\xb5\xec\x03 \x01(\x08:4\n\x0ctypedecl_all\x12\x1c.google.protobuf.FileOptions\x18\xb6\xec\x03 \x01(\x08:4\n\x0c\x65numdecl_all\x12\x1c.google.protobuf.FileOptions\x18\xb7\xec\x03 \x01(\x08:<\n\x14goproto_registration\x12\x1c.google.protobuf.FileOptions\x18\xb8\xec\x03 \x01(\x08:7\n\x0fmessagename_all\x12\x1c.google.protobuf.FileOptions\x18\xb9\xec\x03 \x01(\x08:=\n\x15goproto_sizecache_all\x12\x1c.google.protobuf.FileOptions\x18\xba\xec\x03 \x01(\x08:;\n\x13goproto_unkeyed_all\x12\x1c.google.protobuf.FileOptions\x18\xbb\xec\x03 \x01(\x08::\n\x0fgoproto_getters\x12\x1f.google.protobuf.MessageOptions\x18\x81\xf4\x03 \x01(\x08:;\n\x10goproto_stringer\x12\x1f.google.protobuf.MessageOptions\x18\x83\xf4\x03 \x01(\x08:8\n\rverbose_equal\x12\x1f.google.protobuf.MessageOptions\x18\x84\xf4\x03 \x01(\x08:/\n\x04\x66\x61\x63\x65\x12\x1f.google.protobuf.MessageOptions\x18\x85\xf4\x03 \x01(\x08:3\n\x08gostring\x12\x1f.google.protobuf.MessageOptions\x18\x86\xf4\x03 \x01(\x08:3\n\x08populate\x12\x1f.google.protobuf.MessageOptions\x18\x87\xf4\x03 \x01(\x08:3\n\x08stringer\x12\x1f.google.protobuf.MessageOptions\x18\xc0\x8b\x04 \x01(\x08:2\n\x07onlyone\x12\x1f.google.protobuf.MessageOptions\x18\x89\xf4\x03 \x01(\x08:0\n\x05\x65qual\x12\x1f.google.protobuf.MessageOptions\x18\x8d\xf4\x03 \x01(\x08:6\n\x0b\x64\x65scription\x12\x1f.google.protobuf.MessageOptions\x18\x8e\xf4\x03 \x01(\x08:2\n\x07testgen\x12\x1f.google.protobuf.MessageOptions\x18\x8f\xf4\x03 \x01(\x08:3\n\x08\x62\x65nchgen\x12\x1f.google.protobuf.MessageOptions\x18\x90\xf4\x03 \x01(\x08:4\n\tmarshaler\x12\x1f.google.protobuf.MessageOptions\x18\x91\xf4\x03 \x01(\x08:6\n\x0bunmarshaler\x12\x1f.google.protobuf.MessageOptions\x18\x92\xf4\x03 \x01(\x08:;\n\x10stable_marshaler\x12\x1f.google.protobuf.MessageOptions\x18\x93\xf4\x03 \x01(\x08:0\n\x05sizer\x12\x1f.google.protobuf.MessageOptions\x18\x94\xf4\x03 \x01(\x08:;\n\x10unsafe_marshaler\x12\x1f.google.protobuf.MessageOptions\x18\x97\xf4\x03 \x01(\x08:=\n\x12unsafe_unmarshaler\x12\x1f.google.protobuf.MessageOptions\x18\x98\xf4\x03 \x01(\x08:A\n\x16goproto_extensions_map\x12\x1f.google.protobuf.MessageOptions\x18\x99\xf4\x03 \x01(\x08:?\n\x14goproto_unrecognized\x12\x1f.google.protobuf.MessageOptions\x18\x9a\xf4\x03 \x01(\x08:5\n\nprotosizer\x12\x1f.google.protobuf.MessageOptions\x18\x9c\xf4\x03 \x01(\x08:2\n\x07\x63ompare\x12\x1f.google.protobuf.MessageOptions\x18\x9d\xf4\x03 \x01(\x08:3\n\x08typedecl\x12\x1f.google.protobuf.MessageOptions\x18\x9e\xf4\x03 \x01(\x08:6\n\x0bmessagename\x12\x1f.google.protobuf.MessageOptions\x18\xa1\xf4\x03 \x01(\x08:<\n\x11goproto_sizecache\x12\x1f.google.protobuf.MessageOptions\x18\xa2\xf4\x03 \x01(\x08::\n\x0fgoproto_unkeyed\x12\x1f.google.protobuf.MessageOptions\x18\xa3\xf4\x03 \x01(\x08:1\n\x08nullable\x12\x1d.google.protobuf.FieldOptions\x18\xe9\xfb\x03 \x01(\x08:.\n\x05\x65mbed\x12\x1d.google.protobuf.FieldOptions\x18\xea\xfb\x03 \x01(\x08:3\n\ncustomtype\x12\x1d.google.protobuf.FieldOptions\x18\xeb\xfb\x03 \x01(\t:3\n\ncustomname\x12\x1d.google.protobuf.FieldOptions\x18\xec\xfb\x03 \x01(\t:0\n\x07jsontag\x12\x1d.google.protobuf.FieldOptions\x18\xed\xfb\x03 \x01(\t:1\n\x08moretags\x12\x1d.google.protobuf.FieldOptions\x18\xee\xfb\x03 \x01(\t:1\n\x08\x63\x61sttype\x12\x1d.google.protobuf.FieldOptions\x18\xef\xfb\x03 \x01(\t:0\n\x07\x63\x61stkey\x12\x1d.google.protobuf.FieldOptions\x18\xf0\xfb\x03 \x01(\t:2\n\tcastvalue\x12\x1d.google.protobuf.FieldOptions\x18\xf1\xfb\x03 \x01(\t:0\n\x07stdtime\x12\x1d.google.protobuf.FieldOptions\x18\xf2\xfb\x03 \x01(\x08:4\n\x0bstdduration\x12\x1d.google.protobuf.FieldOptions\x18\xf3\xfb\x03 \x01(\x08:3\n\nwktpointer\x12\x1d.google.protobuf.FieldOptions\x18\xf4\xfb\x03 \x01(\x08\x42\x45\n\x13\x63om.google.protobufB\nGoGoProtosZ\"github.com/gogo/protobuf/gogoproto' - , - dependencies=[google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,]) - - -GOPROTO_ENUM_PREFIX_FIELD_NUMBER = 62001 -goproto_enum_prefix = _descriptor.FieldDescriptor( - name='goproto_enum_prefix', full_name='gogoproto.goproto_enum_prefix', index=0, - number=62001, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_ENUM_STRINGER_FIELD_NUMBER = 62021 -goproto_enum_stringer = _descriptor.FieldDescriptor( - name='goproto_enum_stringer', full_name='gogoproto.goproto_enum_stringer', index=1, - number=62021, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ENUM_STRINGER_FIELD_NUMBER = 62022 -enum_stringer = _descriptor.FieldDescriptor( - name='enum_stringer', full_name='gogoproto.enum_stringer', index=2, - number=62022, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ENUM_CUSTOMNAME_FIELD_NUMBER = 62023 -enum_customname = _descriptor.FieldDescriptor( - name='enum_customname', full_name='gogoproto.enum_customname', index=3, - number=62023, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ENUMDECL_FIELD_NUMBER = 62024 -enumdecl = _descriptor.FieldDescriptor( - name='enumdecl', full_name='gogoproto.enumdecl', index=4, - number=62024, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ENUMVALUE_CUSTOMNAME_FIELD_NUMBER = 66001 -enumvalue_customname = _descriptor.FieldDescriptor( - name='enumvalue_customname', full_name='gogoproto.enumvalue_customname', index=5, - number=66001, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_GETTERS_ALL_FIELD_NUMBER = 63001 -goproto_getters_all = _descriptor.FieldDescriptor( - name='goproto_getters_all', full_name='gogoproto.goproto_getters_all', index=6, - number=63001, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_ENUM_PREFIX_ALL_FIELD_NUMBER = 63002 -goproto_enum_prefix_all = _descriptor.FieldDescriptor( - name='goproto_enum_prefix_all', full_name='gogoproto.goproto_enum_prefix_all', index=7, - number=63002, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_STRINGER_ALL_FIELD_NUMBER = 63003 -goproto_stringer_all = _descriptor.FieldDescriptor( - name='goproto_stringer_all', full_name='gogoproto.goproto_stringer_all', index=8, - number=63003, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -VERBOSE_EQUAL_ALL_FIELD_NUMBER = 63004 -verbose_equal_all = _descriptor.FieldDescriptor( - name='verbose_equal_all', full_name='gogoproto.verbose_equal_all', index=9, - number=63004, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -FACE_ALL_FIELD_NUMBER = 63005 -face_all = _descriptor.FieldDescriptor( - name='face_all', full_name='gogoproto.face_all', index=10, - number=63005, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOSTRING_ALL_FIELD_NUMBER = 63006 -gostring_all = _descriptor.FieldDescriptor( - name='gostring_all', full_name='gogoproto.gostring_all', index=11, - number=63006, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -POPULATE_ALL_FIELD_NUMBER = 63007 -populate_all = _descriptor.FieldDescriptor( - name='populate_all', full_name='gogoproto.populate_all', index=12, - number=63007, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -STRINGER_ALL_FIELD_NUMBER = 63008 -stringer_all = _descriptor.FieldDescriptor( - name='stringer_all', full_name='gogoproto.stringer_all', index=13, - number=63008, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ONLYONE_ALL_FIELD_NUMBER = 63009 -onlyone_all = _descriptor.FieldDescriptor( - name='onlyone_all', full_name='gogoproto.onlyone_all', index=14, - number=63009, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -EQUAL_ALL_FIELD_NUMBER = 63013 -equal_all = _descriptor.FieldDescriptor( - name='equal_all', full_name='gogoproto.equal_all', index=15, - number=63013, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -DESCRIPTION_ALL_FIELD_NUMBER = 63014 -description_all = _descriptor.FieldDescriptor( - name='description_all', full_name='gogoproto.description_all', index=16, - number=63014, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -TESTGEN_ALL_FIELD_NUMBER = 63015 -testgen_all = _descriptor.FieldDescriptor( - name='testgen_all', full_name='gogoproto.testgen_all', index=17, - number=63015, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -BENCHGEN_ALL_FIELD_NUMBER = 63016 -benchgen_all = _descriptor.FieldDescriptor( - name='benchgen_all', full_name='gogoproto.benchgen_all', index=18, - number=63016, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -MARSHALER_ALL_FIELD_NUMBER = 63017 -marshaler_all = _descriptor.FieldDescriptor( - name='marshaler_all', full_name='gogoproto.marshaler_all', index=19, - number=63017, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -UNMARSHALER_ALL_FIELD_NUMBER = 63018 -unmarshaler_all = _descriptor.FieldDescriptor( - name='unmarshaler_all', full_name='gogoproto.unmarshaler_all', index=20, - number=63018, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -STABLE_MARSHALER_ALL_FIELD_NUMBER = 63019 -stable_marshaler_all = _descriptor.FieldDescriptor( - name='stable_marshaler_all', full_name='gogoproto.stable_marshaler_all', index=21, - number=63019, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -SIZER_ALL_FIELD_NUMBER = 63020 -sizer_all = _descriptor.FieldDescriptor( - name='sizer_all', full_name='gogoproto.sizer_all', index=22, - number=63020, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_ENUM_STRINGER_ALL_FIELD_NUMBER = 63021 -goproto_enum_stringer_all = _descriptor.FieldDescriptor( - name='goproto_enum_stringer_all', full_name='gogoproto.goproto_enum_stringer_all', index=23, - number=63021, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ENUM_STRINGER_ALL_FIELD_NUMBER = 63022 -enum_stringer_all = _descriptor.FieldDescriptor( - name='enum_stringer_all', full_name='gogoproto.enum_stringer_all', index=24, - number=63022, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -UNSAFE_MARSHALER_ALL_FIELD_NUMBER = 63023 -unsafe_marshaler_all = _descriptor.FieldDescriptor( - name='unsafe_marshaler_all', full_name='gogoproto.unsafe_marshaler_all', index=25, - number=63023, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -UNSAFE_UNMARSHALER_ALL_FIELD_NUMBER = 63024 -unsafe_unmarshaler_all = _descriptor.FieldDescriptor( - name='unsafe_unmarshaler_all', full_name='gogoproto.unsafe_unmarshaler_all', index=26, - number=63024, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_EXTENSIONS_MAP_ALL_FIELD_NUMBER = 63025 -goproto_extensions_map_all = _descriptor.FieldDescriptor( - name='goproto_extensions_map_all', full_name='gogoproto.goproto_extensions_map_all', index=27, - number=63025, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_UNRECOGNIZED_ALL_FIELD_NUMBER = 63026 -goproto_unrecognized_all = _descriptor.FieldDescriptor( - name='goproto_unrecognized_all', full_name='gogoproto.goproto_unrecognized_all', index=28, - number=63026, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOGOPROTO_IMPORT_FIELD_NUMBER = 63027 -gogoproto_import = _descriptor.FieldDescriptor( - name='gogoproto_import', full_name='gogoproto.gogoproto_import', index=29, - number=63027, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -PROTOSIZER_ALL_FIELD_NUMBER = 63028 -protosizer_all = _descriptor.FieldDescriptor( - name='protosizer_all', full_name='gogoproto.protosizer_all', index=30, - number=63028, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -COMPARE_ALL_FIELD_NUMBER = 63029 -compare_all = _descriptor.FieldDescriptor( - name='compare_all', full_name='gogoproto.compare_all', index=31, - number=63029, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -TYPEDECL_ALL_FIELD_NUMBER = 63030 -typedecl_all = _descriptor.FieldDescriptor( - name='typedecl_all', full_name='gogoproto.typedecl_all', index=32, - number=63030, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ENUMDECL_ALL_FIELD_NUMBER = 63031 -enumdecl_all = _descriptor.FieldDescriptor( - name='enumdecl_all', full_name='gogoproto.enumdecl_all', index=33, - number=63031, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_REGISTRATION_FIELD_NUMBER = 63032 -goproto_registration = _descriptor.FieldDescriptor( - name='goproto_registration', full_name='gogoproto.goproto_registration', index=34, - number=63032, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -MESSAGENAME_ALL_FIELD_NUMBER = 63033 -messagename_all = _descriptor.FieldDescriptor( - name='messagename_all', full_name='gogoproto.messagename_all', index=35, - number=63033, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_SIZECACHE_ALL_FIELD_NUMBER = 63034 -goproto_sizecache_all = _descriptor.FieldDescriptor( - name='goproto_sizecache_all', full_name='gogoproto.goproto_sizecache_all', index=36, - number=63034, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_UNKEYED_ALL_FIELD_NUMBER = 63035 -goproto_unkeyed_all = _descriptor.FieldDescriptor( - name='goproto_unkeyed_all', full_name='gogoproto.goproto_unkeyed_all', index=37, - number=63035, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_GETTERS_FIELD_NUMBER = 64001 -goproto_getters = _descriptor.FieldDescriptor( - name='goproto_getters', full_name='gogoproto.goproto_getters', index=38, - number=64001, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_STRINGER_FIELD_NUMBER = 64003 -goproto_stringer = _descriptor.FieldDescriptor( - name='goproto_stringer', full_name='gogoproto.goproto_stringer', index=39, - number=64003, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -VERBOSE_EQUAL_FIELD_NUMBER = 64004 -verbose_equal = _descriptor.FieldDescriptor( - name='verbose_equal', full_name='gogoproto.verbose_equal', index=40, - number=64004, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -FACE_FIELD_NUMBER = 64005 -face = _descriptor.FieldDescriptor( - name='face', full_name='gogoproto.face', index=41, - number=64005, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOSTRING_FIELD_NUMBER = 64006 -gostring = _descriptor.FieldDescriptor( - name='gostring', full_name='gogoproto.gostring', index=42, - number=64006, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -POPULATE_FIELD_NUMBER = 64007 -populate = _descriptor.FieldDescriptor( - name='populate', full_name='gogoproto.populate', index=43, - number=64007, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -STRINGER_FIELD_NUMBER = 67008 -stringer = _descriptor.FieldDescriptor( - name='stringer', full_name='gogoproto.stringer', index=44, - number=67008, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -ONLYONE_FIELD_NUMBER = 64009 -onlyone = _descriptor.FieldDescriptor( - name='onlyone', full_name='gogoproto.onlyone', index=45, - number=64009, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -EQUAL_FIELD_NUMBER = 64013 -equal = _descriptor.FieldDescriptor( - name='equal', full_name='gogoproto.equal', index=46, - number=64013, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -DESCRIPTION_FIELD_NUMBER = 64014 -description = _descriptor.FieldDescriptor( - name='description', full_name='gogoproto.description', index=47, - number=64014, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -TESTGEN_FIELD_NUMBER = 64015 -testgen = _descriptor.FieldDescriptor( - name='testgen', full_name='gogoproto.testgen', index=48, - number=64015, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -BENCHGEN_FIELD_NUMBER = 64016 -benchgen = _descriptor.FieldDescriptor( - name='benchgen', full_name='gogoproto.benchgen', index=49, - number=64016, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -MARSHALER_FIELD_NUMBER = 64017 -marshaler = _descriptor.FieldDescriptor( - name='marshaler', full_name='gogoproto.marshaler', index=50, - number=64017, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -UNMARSHALER_FIELD_NUMBER = 64018 -unmarshaler = _descriptor.FieldDescriptor( - name='unmarshaler', full_name='gogoproto.unmarshaler', index=51, - number=64018, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -STABLE_MARSHALER_FIELD_NUMBER = 64019 -stable_marshaler = _descriptor.FieldDescriptor( - name='stable_marshaler', full_name='gogoproto.stable_marshaler', index=52, - number=64019, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -SIZER_FIELD_NUMBER = 64020 -sizer = _descriptor.FieldDescriptor( - name='sizer', full_name='gogoproto.sizer', index=53, - number=64020, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -UNSAFE_MARSHALER_FIELD_NUMBER = 64023 -unsafe_marshaler = _descriptor.FieldDescriptor( - name='unsafe_marshaler', full_name='gogoproto.unsafe_marshaler', index=54, - number=64023, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -UNSAFE_UNMARSHALER_FIELD_NUMBER = 64024 -unsafe_unmarshaler = _descriptor.FieldDescriptor( - name='unsafe_unmarshaler', full_name='gogoproto.unsafe_unmarshaler', index=55, - number=64024, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_EXTENSIONS_MAP_FIELD_NUMBER = 64025 -goproto_extensions_map = _descriptor.FieldDescriptor( - name='goproto_extensions_map', full_name='gogoproto.goproto_extensions_map', index=56, - number=64025, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_UNRECOGNIZED_FIELD_NUMBER = 64026 -goproto_unrecognized = _descriptor.FieldDescriptor( - name='goproto_unrecognized', full_name='gogoproto.goproto_unrecognized', index=57, - number=64026, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -PROTOSIZER_FIELD_NUMBER = 64028 -protosizer = _descriptor.FieldDescriptor( - name='protosizer', full_name='gogoproto.protosizer', index=58, - number=64028, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -COMPARE_FIELD_NUMBER = 64029 -compare = _descriptor.FieldDescriptor( - name='compare', full_name='gogoproto.compare', index=59, - number=64029, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -TYPEDECL_FIELD_NUMBER = 64030 -typedecl = _descriptor.FieldDescriptor( - name='typedecl', full_name='gogoproto.typedecl', index=60, - number=64030, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -MESSAGENAME_FIELD_NUMBER = 64033 -messagename = _descriptor.FieldDescriptor( - name='messagename', full_name='gogoproto.messagename', index=61, - number=64033, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_SIZECACHE_FIELD_NUMBER = 64034 -goproto_sizecache = _descriptor.FieldDescriptor( - name='goproto_sizecache', full_name='gogoproto.goproto_sizecache', index=62, - number=64034, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -GOPROTO_UNKEYED_FIELD_NUMBER = 64035 -goproto_unkeyed = _descriptor.FieldDescriptor( - name='goproto_unkeyed', full_name='gogoproto.goproto_unkeyed', index=63, - number=64035, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -NULLABLE_FIELD_NUMBER = 65001 -nullable = _descriptor.FieldDescriptor( - name='nullable', full_name='gogoproto.nullable', index=64, - number=65001, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -EMBED_FIELD_NUMBER = 65002 -embed = _descriptor.FieldDescriptor( - name='embed', full_name='gogoproto.embed', index=65, - number=65002, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -CUSTOMTYPE_FIELD_NUMBER = 65003 -customtype = _descriptor.FieldDescriptor( - name='customtype', full_name='gogoproto.customtype', index=66, - number=65003, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -CUSTOMNAME_FIELD_NUMBER = 65004 -customname = _descriptor.FieldDescriptor( - name='customname', full_name='gogoproto.customname', index=67, - number=65004, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -JSONTAG_FIELD_NUMBER = 65005 -jsontag = _descriptor.FieldDescriptor( - name='jsontag', full_name='gogoproto.jsontag', index=68, - number=65005, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -MORETAGS_FIELD_NUMBER = 65006 -moretags = _descriptor.FieldDescriptor( - name='moretags', full_name='gogoproto.moretags', index=69, - number=65006, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -CASTTYPE_FIELD_NUMBER = 65007 -casttype = _descriptor.FieldDescriptor( - name='casttype', full_name='gogoproto.casttype', index=70, - number=65007, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -CASTKEY_FIELD_NUMBER = 65008 -castkey = _descriptor.FieldDescriptor( - name='castkey', full_name='gogoproto.castkey', index=71, - number=65008, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -CASTVALUE_FIELD_NUMBER = 65009 -castvalue = _descriptor.FieldDescriptor( - name='castvalue', full_name='gogoproto.castvalue', index=72, - number=65009, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -STDTIME_FIELD_NUMBER = 65010 -stdtime = _descriptor.FieldDescriptor( - name='stdtime', full_name='gogoproto.stdtime', index=73, - number=65010, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -STDDURATION_FIELD_NUMBER = 65011 -stdduration = _descriptor.FieldDescriptor( - name='stdduration', full_name='gogoproto.stdduration', index=74, - number=65011, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) -WKTPOINTER_FIELD_NUMBER = 65012 -wktpointer = _descriptor.FieldDescriptor( - name='wktpointer', full_name='gogoproto.wktpointer', index=75, - number=65012, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) - -DESCRIPTOR.extensions_by_name['goproto_enum_prefix'] = goproto_enum_prefix -DESCRIPTOR.extensions_by_name['goproto_enum_stringer'] = goproto_enum_stringer -DESCRIPTOR.extensions_by_name['enum_stringer'] = enum_stringer -DESCRIPTOR.extensions_by_name['enum_customname'] = enum_customname -DESCRIPTOR.extensions_by_name['enumdecl'] = enumdecl -DESCRIPTOR.extensions_by_name['enumvalue_customname'] = enumvalue_customname -DESCRIPTOR.extensions_by_name['goproto_getters_all'] = goproto_getters_all -DESCRIPTOR.extensions_by_name['goproto_enum_prefix_all'] = goproto_enum_prefix_all -DESCRIPTOR.extensions_by_name['goproto_stringer_all'] = goproto_stringer_all -DESCRIPTOR.extensions_by_name['verbose_equal_all'] = verbose_equal_all -DESCRIPTOR.extensions_by_name['face_all'] = face_all -DESCRIPTOR.extensions_by_name['gostring_all'] = gostring_all -DESCRIPTOR.extensions_by_name['populate_all'] = populate_all -DESCRIPTOR.extensions_by_name['stringer_all'] = stringer_all -DESCRIPTOR.extensions_by_name['onlyone_all'] = onlyone_all -DESCRIPTOR.extensions_by_name['equal_all'] = equal_all -DESCRIPTOR.extensions_by_name['description_all'] = description_all -DESCRIPTOR.extensions_by_name['testgen_all'] = testgen_all -DESCRIPTOR.extensions_by_name['benchgen_all'] = benchgen_all -DESCRIPTOR.extensions_by_name['marshaler_all'] = marshaler_all -DESCRIPTOR.extensions_by_name['unmarshaler_all'] = unmarshaler_all -DESCRIPTOR.extensions_by_name['stable_marshaler_all'] = stable_marshaler_all -DESCRIPTOR.extensions_by_name['sizer_all'] = sizer_all -DESCRIPTOR.extensions_by_name['goproto_enum_stringer_all'] = goproto_enum_stringer_all -DESCRIPTOR.extensions_by_name['enum_stringer_all'] = enum_stringer_all -DESCRIPTOR.extensions_by_name['unsafe_marshaler_all'] = unsafe_marshaler_all -DESCRIPTOR.extensions_by_name['unsafe_unmarshaler_all'] = unsafe_unmarshaler_all -DESCRIPTOR.extensions_by_name['goproto_extensions_map_all'] = goproto_extensions_map_all -DESCRIPTOR.extensions_by_name['goproto_unrecognized_all'] = goproto_unrecognized_all -DESCRIPTOR.extensions_by_name['gogoproto_import'] = gogoproto_import -DESCRIPTOR.extensions_by_name['protosizer_all'] = protosizer_all -DESCRIPTOR.extensions_by_name['compare_all'] = compare_all -DESCRIPTOR.extensions_by_name['typedecl_all'] = typedecl_all -DESCRIPTOR.extensions_by_name['enumdecl_all'] = enumdecl_all -DESCRIPTOR.extensions_by_name['goproto_registration'] = goproto_registration -DESCRIPTOR.extensions_by_name['messagename_all'] = messagename_all -DESCRIPTOR.extensions_by_name['goproto_sizecache_all'] = goproto_sizecache_all -DESCRIPTOR.extensions_by_name['goproto_unkeyed_all'] = goproto_unkeyed_all -DESCRIPTOR.extensions_by_name['goproto_getters'] = goproto_getters -DESCRIPTOR.extensions_by_name['goproto_stringer'] = goproto_stringer -DESCRIPTOR.extensions_by_name['verbose_equal'] = verbose_equal -DESCRIPTOR.extensions_by_name['face'] = face -DESCRIPTOR.extensions_by_name['gostring'] = gostring -DESCRIPTOR.extensions_by_name['populate'] = populate -DESCRIPTOR.extensions_by_name['stringer'] = stringer -DESCRIPTOR.extensions_by_name['onlyone'] = onlyone -DESCRIPTOR.extensions_by_name['equal'] = equal -DESCRIPTOR.extensions_by_name['description'] = description -DESCRIPTOR.extensions_by_name['testgen'] = testgen -DESCRIPTOR.extensions_by_name['benchgen'] = benchgen -DESCRIPTOR.extensions_by_name['marshaler'] = marshaler -DESCRIPTOR.extensions_by_name['unmarshaler'] = unmarshaler -DESCRIPTOR.extensions_by_name['stable_marshaler'] = stable_marshaler -DESCRIPTOR.extensions_by_name['sizer'] = sizer -DESCRIPTOR.extensions_by_name['unsafe_marshaler'] = unsafe_marshaler -DESCRIPTOR.extensions_by_name['unsafe_unmarshaler'] = unsafe_unmarshaler -DESCRIPTOR.extensions_by_name['goproto_extensions_map'] = goproto_extensions_map -DESCRIPTOR.extensions_by_name['goproto_unrecognized'] = goproto_unrecognized -DESCRIPTOR.extensions_by_name['protosizer'] = protosizer -DESCRIPTOR.extensions_by_name['compare'] = compare -DESCRIPTOR.extensions_by_name['typedecl'] = typedecl -DESCRIPTOR.extensions_by_name['messagename'] = messagename -DESCRIPTOR.extensions_by_name['goproto_sizecache'] = goproto_sizecache -DESCRIPTOR.extensions_by_name['goproto_unkeyed'] = goproto_unkeyed -DESCRIPTOR.extensions_by_name['nullable'] = nullable -DESCRIPTOR.extensions_by_name['embed'] = embed -DESCRIPTOR.extensions_by_name['customtype'] = customtype -DESCRIPTOR.extensions_by_name['customname'] = customname -DESCRIPTOR.extensions_by_name['jsontag'] = jsontag -DESCRIPTOR.extensions_by_name['moretags'] = moretags -DESCRIPTOR.extensions_by_name['casttype'] = casttype -DESCRIPTOR.extensions_by_name['castkey'] = castkey -DESCRIPTOR.extensions_by_name['castvalue'] = castvalue -DESCRIPTOR.extensions_by_name['stdtime'] = stdtime -DESCRIPTOR.extensions_by_name['stdduration'] = stdduration -DESCRIPTOR.extensions_by_name['wktpointer'] = wktpointer -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(goproto_enum_prefix) -google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(goproto_enum_stringer) -google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(enum_stringer) -google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(enum_customname) -google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(enumdecl) -google_dot_protobuf_dot_descriptor__pb2.EnumValueOptions.RegisterExtension(enumvalue_customname) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_getters_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_enum_prefix_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_stringer_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(verbose_equal_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(face_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(gostring_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(populate_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(stringer_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(onlyone_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(equal_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(description_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(testgen_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(benchgen_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(marshaler_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(unmarshaler_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(stable_marshaler_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(sizer_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_enum_stringer_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(enum_stringer_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(unsafe_marshaler_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(unsafe_unmarshaler_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_extensions_map_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_unrecognized_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(gogoproto_import) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(protosizer_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(compare_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(typedecl_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(enumdecl_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_registration) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(messagename_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_sizecache_all) -google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(goproto_unkeyed_all) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(goproto_getters) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(goproto_stringer) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(verbose_equal) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(face) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(gostring) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(populate) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(stringer) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(onlyone) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(equal) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(description) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(testgen) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(benchgen) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(marshaler) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(unmarshaler) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(stable_marshaler) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(sizer) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(unsafe_marshaler) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(unsafe_unmarshaler) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(goproto_extensions_map) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(goproto_unrecognized) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(protosizer) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(compare) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(typedecl) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(messagename) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(goproto_sizecache) -google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(goproto_unkeyed) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(nullable) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(embed) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(customtype) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(customname) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(jsontag) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(moretags) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(casttype) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(castkey) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(castvalue) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(stdtime) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(stdduration) -google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(wktpointer) - -DESCRIPTOR._options = None -# @@protoc_insertion_point(module_scope) diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/remote.proto b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/remote.proto deleted file mode 100644 index ecd8f0bb19..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/remote.proto +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2016 Prometheus Team -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; -package prometheus; - -option go_package = "prompb"; - -import "types.proto"; -import "gogoproto/gogo.proto"; - -message WriteRequest { - repeated prometheus.TimeSeries timeseries = 1 [(gogoproto.nullable) = false]; -} - -// ReadRequest represents a remote read request. -message ReadRequest { - repeated Query queries = 1; - - enum ResponseType { - // Server will return a single ReadResponse message with matched series that includes list of raw samples. - // It's recommended to use streamed response types instead. - // - // Response headers: - // Content-Type: "application/x-protobuf" - // Content-Encoding: "snappy" - SAMPLES = 0; - // Server will stream a delimited ChunkedReadResponse message that contains XOR encoded chunks for a single series. - // Each message is following varint size and fixed size bigendian uint32 for CRC32 Castagnoli checksum. - // - // Response headers: - // Content-Type: "application/x-streamed-protobuf; proto=prometheus.ChunkedReadResponse" - // Content-Encoding: "" - STREAMED_XOR_CHUNKS = 1; - } - - // accepted_response_types allows negotiating the content type of the response. - // - // Response types are taken from the list in the FIFO order. If no response type in `accepted_response_types` is - // implemented by server, error is returned. - // For request that do not contain `accepted_response_types` field the SAMPLES response type will be used. - repeated ResponseType accepted_response_types = 2; -} - -// ReadResponse is a response when response_type equals SAMPLES. -message ReadResponse { - // In same order as the request's queries. - repeated QueryResult results = 1; -} - -message Query { - int64 start_timestamp_ms = 1; - int64 end_timestamp_ms = 2; - repeated prometheus.LabelMatcher matchers = 3; - prometheus.ReadHints hints = 4; -} - -message QueryResult { - // Samples within a time series must be ordered by time. - repeated prometheus.TimeSeries timeseries = 1; -} - -// ChunkedReadResponse is a response when response_type equals STREAMED_XOR_CHUNKS. -// We strictly stream full series after series, optionally split by time. This means that a single frame can contain -// partition of the single series, but once a new series is started to be streamed it means that no more chunks will -// be sent for previous one. Series are returned sorted in the same way TSDB block are internally. -message ChunkedReadResponse { - repeated prometheus.ChunkedSeries chunked_series = 1; - - // query_index represents an index of the query from ReadRequest.queries these chunks relates to. - int64 query_index = 2; -} diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/remote_pb2.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/remote_pb2.py deleted file mode 100644 index 06e0086321..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/remote_pb2.py +++ /dev/null @@ -1,345 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: remote.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from . import types_pb2 as types__pb2 -from .gogoproto import gogo_pb2 as gogoproto_dot_gogo__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='remote.proto', - package='prometheus', - syntax='proto3', - serialized_options=b'Z\006prompb', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0cremote.proto\x12\nprometheus\x1a\x0btypes.proto\x1a\x14gogoproto/gogo.proto\"@\n\x0cWriteRequest\x12\x30\n\ntimeseries\x18\x01 \x03(\x0b\x32\x16.prometheus.TimeSeriesB\x04\xc8\xde\x1f\x00\"\xae\x01\n\x0bReadRequest\x12\"\n\x07queries\x18\x01 \x03(\x0b\x32\x11.prometheus.Query\x12\x45\n\x17\x61\x63\x63\x65pted_response_types\x18\x02 \x03(\x0e\x32$.prometheus.ReadRequest.ResponseType\"4\n\x0cResponseType\x12\x0b\n\x07SAMPLES\x10\x00\x12\x17\n\x13STREAMED_XOR_CHUNKS\x10\x01\"8\n\x0cReadResponse\x12(\n\x07results\x18\x01 \x03(\x0b\x32\x17.prometheus.QueryResult\"\x8f\x01\n\x05Query\x12\x1a\n\x12start_timestamp_ms\x18\x01 \x01(\x03\x12\x18\n\x10\x65nd_timestamp_ms\x18\x02 \x01(\x03\x12*\n\x08matchers\x18\x03 \x03(\x0b\x32\x18.prometheus.LabelMatcher\x12$\n\x05hints\x18\x04 \x01(\x0b\x32\x15.prometheus.ReadHints\"9\n\x0bQueryResult\x12*\n\ntimeseries\x18\x01 \x03(\x0b\x32\x16.prometheus.TimeSeries\"]\n\x13\x43hunkedReadResponse\x12\x31\n\x0e\x63hunked_series\x18\x01 \x03(\x0b\x32\x19.prometheus.ChunkedSeries\x12\x13\n\x0bquery_index\x18\x02 \x01(\x03\x42\x08Z\x06prompbb\x06proto3' - , - dependencies=[types__pb2.DESCRIPTOR,gogoproto_dot_gogo__pb2.DESCRIPTOR,]) - - - -_READREQUEST_RESPONSETYPE = _descriptor.EnumDescriptor( - name='ResponseType', - full_name='prometheus.ReadRequest.ResponseType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='SAMPLES', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='STREAMED_XOR_CHUNKS', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=252, - serialized_end=304, -) -_sym_db.RegisterEnumDescriptor(_READREQUEST_RESPONSETYPE) - - -_WRITEREQUEST = _descriptor.Descriptor( - name='WriteRequest', - full_name='prometheus.WriteRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timeseries', full_name='prometheus.WriteRequest.timeseries', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'\310\336\037\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=63, - serialized_end=127, -) - - -_READREQUEST = _descriptor.Descriptor( - name='ReadRequest', - full_name='prometheus.ReadRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='queries', full_name='prometheus.ReadRequest.queries', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='accepted_response_types', full_name='prometheus.ReadRequest.accepted_response_types', index=1, - number=2, type=14, cpp_type=8, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _READREQUEST_RESPONSETYPE, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=130, - serialized_end=304, -) - - -_READRESPONSE = _descriptor.Descriptor( - name='ReadResponse', - full_name='prometheus.ReadResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='results', full_name='prometheus.ReadResponse.results', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=306, - serialized_end=362, -) - - -_QUERY = _descriptor.Descriptor( - name='Query', - full_name='prometheus.Query', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='start_timestamp_ms', full_name='prometheus.Query.start_timestamp_ms', index=0, - number=1, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end_timestamp_ms', full_name='prometheus.Query.end_timestamp_ms', index=1, - number=2, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='matchers', full_name='prometheus.Query.matchers', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='hints', full_name='prometheus.Query.hints', index=3, - number=4, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=365, - serialized_end=508, -) - - -_QUERYRESULT = _descriptor.Descriptor( - name='QueryResult', - full_name='prometheus.QueryResult', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='timeseries', full_name='prometheus.QueryResult.timeseries', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=510, - serialized_end=567, -) - - -_CHUNKEDREADRESPONSE = _descriptor.Descriptor( - name='ChunkedReadResponse', - full_name='prometheus.ChunkedReadResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='chunked_series', full_name='prometheus.ChunkedReadResponse.chunked_series', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='query_index', full_name='prometheus.ChunkedReadResponse.query_index', index=1, - number=2, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=569, - serialized_end=662, -) - -_WRITEREQUEST.fields_by_name['timeseries'].message_type = types__pb2._TIMESERIES -_READREQUEST.fields_by_name['queries'].message_type = _QUERY -_READREQUEST.fields_by_name['accepted_response_types'].enum_type = _READREQUEST_RESPONSETYPE -_READREQUEST_RESPONSETYPE.containing_type = _READREQUEST -_READRESPONSE.fields_by_name['results'].message_type = _QUERYRESULT -_QUERY.fields_by_name['matchers'].message_type = types__pb2._LABELMATCHER -_QUERY.fields_by_name['hints'].message_type = types__pb2._READHINTS -_QUERYRESULT.fields_by_name['timeseries'].message_type = types__pb2._TIMESERIES -_CHUNKEDREADRESPONSE.fields_by_name['chunked_series'].message_type = types__pb2._CHUNKEDSERIES -DESCRIPTOR.message_types_by_name['WriteRequest'] = _WRITEREQUEST -DESCRIPTOR.message_types_by_name['ReadRequest'] = _READREQUEST -DESCRIPTOR.message_types_by_name['ReadResponse'] = _READRESPONSE -DESCRIPTOR.message_types_by_name['Query'] = _QUERY -DESCRIPTOR.message_types_by_name['QueryResult'] = _QUERYRESULT -DESCRIPTOR.message_types_by_name['ChunkedReadResponse'] = _CHUNKEDREADRESPONSE -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -WriteRequest = _reflection.GeneratedProtocolMessageType('WriteRequest', (_message.Message,), { - 'DESCRIPTOR' : _WRITEREQUEST, - '__module__' : 'remote_pb2' - # @@protoc_insertion_point(class_scope:prometheus.WriteRequest) - }) -_sym_db.RegisterMessage(WriteRequest) - -ReadRequest = _reflection.GeneratedProtocolMessageType('ReadRequest', (_message.Message,), { - 'DESCRIPTOR' : _READREQUEST, - '__module__' : 'remote_pb2' - # @@protoc_insertion_point(class_scope:prometheus.ReadRequest) - }) -_sym_db.RegisterMessage(ReadRequest) - -ReadResponse = _reflection.GeneratedProtocolMessageType('ReadResponse', (_message.Message,), { - 'DESCRIPTOR' : _READRESPONSE, - '__module__' : 'remote_pb2' - # @@protoc_insertion_point(class_scope:prometheus.ReadResponse) - }) -_sym_db.RegisterMessage(ReadResponse) - -Query = _reflection.GeneratedProtocolMessageType('Query', (_message.Message,), { - 'DESCRIPTOR' : _QUERY, - '__module__' : 'remote_pb2' - # @@protoc_insertion_point(class_scope:prometheus.Query) - }) -_sym_db.RegisterMessage(Query) - -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'remote_pb2' - # @@protoc_insertion_point(class_scope:prometheus.QueryResult) - }) -_sym_db.RegisterMessage(QueryResult) - -ChunkedReadResponse = _reflection.GeneratedProtocolMessageType('ChunkedReadResponse', (_message.Message,), { - 'DESCRIPTOR' : _CHUNKEDREADRESPONSE, - '__module__' : 'remote_pb2' - # @@protoc_insertion_point(class_scope:prometheus.ChunkedReadResponse) - }) -_sym_db.RegisterMessage(ChunkedReadResponse) - - -DESCRIPTOR._options = None -_WRITEREQUEST.fields_by_name['timeseries']._options = None -# @@protoc_insertion_point(module_scope) diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/types.proto b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/types.proto deleted file mode 100644 index de437d1827..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/types.proto +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2017 Prometheus Team -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; -package prometheus; - -option go_package = "prompb"; - -import "gogoproto/gogo.proto"; - -message Sample { - double value = 1; - int64 timestamp = 2; -} - -// TimeSeries represents samples and labels for a single time series. -message TimeSeries { - repeated Label labels = 1 [(gogoproto.nullable) = false]; - repeated Sample samples = 2 [(gogoproto.nullable) = false]; -} - -message Label { - string name = 1; - string value = 2; -} - -message Labels { - repeated Label labels = 1 [(gogoproto.nullable) = false]; -} - -// Matcher specifies a rule, which can match or set of labels or not. -message LabelMatcher { - enum Type { - EQ = 0; - NEQ = 1; - RE = 2; - NRE = 3; - } - Type type = 1; - string name = 2; - string value = 3; -} - -message ReadHints { - int64 step_ms = 1; // Query step size in milliseconds. - string func = 2; // String representation of surrounding function or aggregation. - int64 start_ms = 3; // Start time in milliseconds. - int64 end_ms = 4; // End time in milliseconds. - repeated string grouping = 5; // List of label names used in aggregation. - bool by = 6; // Indicate whether it is without or by. - int64 range_ms = 7; // Range vector selector range in milliseconds. -} - -// Chunk represents a TSDB chunk. -// Time range [min, max] is inclusive. -message Chunk { - int64 min_time_ms = 1; - int64 max_time_ms = 2; - - // We require this to match chunkenc.Encoding. - enum Encoding { - UNKNOWN = 0; - XOR = 1; - } - Encoding type = 3; - bytes data = 4; -} - -// ChunkedSeries represents single, encoded time series. -message ChunkedSeries { - // Labels should be sorted. - repeated Label labels = 1 [(gogoproto.nullable) = false]; - // Chunks will be in start time order and may overlap. - repeated Chunk chunks = 2 [(gogoproto.nullable) = false]; -} diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/types_pb2.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/types_pb2.py deleted file mode 100644 index 7fc7601971..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen/types_pb2.py +++ /dev/null @@ -1,534 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: types.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from .gogoproto import gogo_pb2 as gogoproto_dot_gogo__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='types.proto', - package='prometheus', - syntax='proto3', - serialized_options=b'Z\006prompb', - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0btypes.proto\x12\nprometheus\x1a\x14gogoproto/gogo.proto\"*\n\x06Sample\x12\r\n\x05value\x18\x01 \x01(\x01\x12\x11\n\ttimestamp\x18\x02 \x01(\x03\"`\n\nTimeSeries\x12\'\n\x06labels\x18\x01 \x03(\x0b\x32\x11.prometheus.LabelB\x04\xc8\xde\x1f\x00\x12)\n\x07samples\x18\x02 \x03(\x0b\x32\x12.prometheus.SampleB\x04\xc8\xde\x1f\x00\"$\n\x05Label\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"1\n\x06Labels\x12\'\n\x06labels\x18\x01 \x03(\x0b\x32\x11.prometheus.LabelB\x04\xc8\xde\x1f\x00\"\x82\x01\n\x0cLabelMatcher\x12+\n\x04type\x18\x01 \x01(\x0e\x32\x1d.prometheus.LabelMatcher.Type\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\"(\n\x04Type\x12\x06\n\x02\x45Q\x10\x00\x12\x07\n\x03NEQ\x10\x01\x12\x06\n\x02RE\x10\x02\x12\x07\n\x03NRE\x10\x03\"|\n\tReadHints\x12\x0f\n\x07step_ms\x18\x01 \x01(\x03\x12\x0c\n\x04\x66unc\x18\x02 \x01(\t\x12\x10\n\x08start_ms\x18\x03 \x01(\x03\x12\x0e\n\x06\x65nd_ms\x18\x04 \x01(\x03\x12\x10\n\x08grouping\x18\x05 \x03(\t\x12\n\n\x02\x62y\x18\x06 \x01(\x08\x12\x10\n\x08range_ms\x18\x07 \x01(\x03\"\x8b\x01\n\x05\x43hunk\x12\x13\n\x0bmin_time_ms\x18\x01 \x01(\x03\x12\x13\n\x0bmax_time_ms\x18\x02 \x01(\x03\x12(\n\x04type\x18\x03 \x01(\x0e\x32\x1a.prometheus.Chunk.Encoding\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\" \n\x08\x45ncoding\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03XOR\x10\x01\"a\n\rChunkedSeries\x12\'\n\x06labels\x18\x01 \x03(\x0b\x32\x11.prometheus.LabelB\x04\xc8\xde\x1f\x00\x12\'\n\x06\x63hunks\x18\x02 \x03(\x0b\x32\x11.prometheus.ChunkB\x04\xc8\xde\x1f\x00\x42\x08Z\x06prompbb\x06proto3' - , - dependencies=[gogoproto_dot_gogo__pb2.DESCRIPTOR,]) - - - -_LABELMATCHER_TYPE = _descriptor.EnumDescriptor( - name='Type', - full_name='prometheus.LabelMatcher.Type', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='EQ', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='NEQ', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='RE', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='NRE', index=3, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=371, - serialized_end=411, -) -_sym_db.RegisterEnumDescriptor(_LABELMATCHER_TYPE) - -_CHUNK_ENCODING = _descriptor.EnumDescriptor( - name='Encoding', - full_name='prometheus.Chunk.Encoding', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='UNKNOWN', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='XOR', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=647, - serialized_end=679, -) -_sym_db.RegisterEnumDescriptor(_CHUNK_ENCODING) - - -_SAMPLE = _descriptor.Descriptor( - name='Sample', - full_name='prometheus.Sample', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='prometheus.Sample.value', index=0, - number=1, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp', full_name='prometheus.Sample.timestamp', index=1, - number=2, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=49, - serialized_end=91, -) - - -_TIMESERIES = _descriptor.Descriptor( - name='TimeSeries', - full_name='prometheus.TimeSeries', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='labels', full_name='prometheus.TimeSeries.labels', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'\310\336\037\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='samples', full_name='prometheus.TimeSeries.samples', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'\310\336\037\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=93, - serialized_end=189, -) - - -_LABEL = _descriptor.Descriptor( - name='Label', - full_name='prometheus.Label', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='prometheus.Label.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='prometheus.Label.value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=191, - serialized_end=227, -) - - -_LABELS = _descriptor.Descriptor( - name='Labels', - full_name='prometheus.Labels', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='labels', full_name='prometheus.Labels.labels', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'\310\336\037\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=229, - serialized_end=278, -) - - -_LABELMATCHER = _descriptor.Descriptor( - name='LabelMatcher', - full_name='prometheus.LabelMatcher', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='prometheus.LabelMatcher.type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='name', full_name='prometheus.LabelMatcher.name', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='prometheus.LabelMatcher.value', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _LABELMATCHER_TYPE, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=281, - serialized_end=411, -) - - -_READHINTS = _descriptor.Descriptor( - name='ReadHints', - full_name='prometheus.ReadHints', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='step_ms', full_name='prometheus.ReadHints.step_ms', index=0, - number=1, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='func', full_name='prometheus.ReadHints.func', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='start_ms', full_name='prometheus.ReadHints.start_ms', index=2, - number=3, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end_ms', full_name='prometheus.ReadHints.end_ms', index=3, - number=4, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='grouping', full_name='prometheus.ReadHints.grouping', index=4, - number=5, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='by', full_name='prometheus.ReadHints.by', index=5, - number=6, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='range_ms', full_name='prometheus.ReadHints.range_ms', index=6, - number=7, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=413, - serialized_end=537, -) - - -_CHUNK = _descriptor.Descriptor( - name='Chunk', - full_name='prometheus.Chunk', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='min_time_ms', full_name='prometheus.Chunk.min_time_ms', index=0, - number=1, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='max_time_ms', full_name='prometheus.Chunk.max_time_ms', index=1, - number=2, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='type', full_name='prometheus.Chunk.type', index=2, - number=3, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='data', full_name='prometheus.Chunk.data', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _CHUNK_ENCODING, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=540, - serialized_end=679, -) - - -_CHUNKEDSERIES = _descriptor.Descriptor( - name='ChunkedSeries', - full_name='prometheus.ChunkedSeries', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='labels', full_name='prometheus.ChunkedSeries.labels', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'\310\336\037\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='chunks', full_name='prometheus.ChunkedSeries.chunks', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'\310\336\037\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=681, - serialized_end=778, -) - -_TIMESERIES.fields_by_name['labels'].message_type = _LABEL -_TIMESERIES.fields_by_name['samples'].message_type = _SAMPLE -_LABELS.fields_by_name['labels'].message_type = _LABEL -_LABELMATCHER.fields_by_name['type'].enum_type = _LABELMATCHER_TYPE -_LABELMATCHER_TYPE.containing_type = _LABELMATCHER -_CHUNK.fields_by_name['type'].enum_type = _CHUNK_ENCODING -_CHUNK_ENCODING.containing_type = _CHUNK -_CHUNKEDSERIES.fields_by_name['labels'].message_type = _LABEL -_CHUNKEDSERIES.fields_by_name['chunks'].message_type = _CHUNK -DESCRIPTOR.message_types_by_name['Sample'] = _SAMPLE -DESCRIPTOR.message_types_by_name['TimeSeries'] = _TIMESERIES -DESCRIPTOR.message_types_by_name['Label'] = _LABEL -DESCRIPTOR.message_types_by_name['Labels'] = _LABELS -DESCRIPTOR.message_types_by_name['LabelMatcher'] = _LABELMATCHER -DESCRIPTOR.message_types_by_name['ReadHints'] = _READHINTS -DESCRIPTOR.message_types_by_name['Chunk'] = _CHUNK -DESCRIPTOR.message_types_by_name['ChunkedSeries'] = _CHUNKEDSERIES -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -Sample = _reflection.GeneratedProtocolMessageType('Sample', (_message.Message,), { - 'DESCRIPTOR' : _SAMPLE, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.Sample) - }) -_sym_db.RegisterMessage(Sample) - -TimeSeries = _reflection.GeneratedProtocolMessageType('TimeSeries', (_message.Message,), { - 'DESCRIPTOR' : _TIMESERIES, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.TimeSeries) - }) -_sym_db.RegisterMessage(TimeSeries) - -Label = _reflection.GeneratedProtocolMessageType('Label', (_message.Message,), { - 'DESCRIPTOR' : _LABEL, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.Label) - }) -_sym_db.RegisterMessage(Label) - -Labels = _reflection.GeneratedProtocolMessageType('Labels', (_message.Message,), { - 'DESCRIPTOR' : _LABELS, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.Labels) - }) -_sym_db.RegisterMessage(Labels) - -LabelMatcher = _reflection.GeneratedProtocolMessageType('LabelMatcher', (_message.Message,), { - 'DESCRIPTOR' : _LABELMATCHER, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.LabelMatcher) - }) -_sym_db.RegisterMessage(LabelMatcher) - -ReadHints = _reflection.GeneratedProtocolMessageType('ReadHints', (_message.Message,), { - 'DESCRIPTOR' : _READHINTS, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.ReadHints) - }) -_sym_db.RegisterMessage(ReadHints) - -Chunk = _reflection.GeneratedProtocolMessageType('Chunk', (_message.Message,), { - 'DESCRIPTOR' : _CHUNK, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.Chunk) - }) -_sym_db.RegisterMessage(Chunk) - -ChunkedSeries = _reflection.GeneratedProtocolMessageType('ChunkedSeries', (_message.Message,), { - 'DESCRIPTOR' : _CHUNKEDSERIES, - '__module__' : 'types_pb2' - # @@protoc_insertion_point(class_scope:prometheus.ChunkedSeries) - }) -_sym_db.RegisterMessage(ChunkedSeries) - - -DESCRIPTOR._options = None -_TIMESERIES.fields_by_name['labels']._options = None -_TIMESERIES.fields_by_name['samples']._options = None -_LABELS.fields_by_name['labels']._options = None -_CHUNKEDSERIES.fields_by_name['labels']._options = None -_CHUNKEDSERIES.fields_by_name['chunks']._options = None -# @@protoc_insertion_point(module_scope) diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py deleted file mode 100644 index ebb75f6c11..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/version.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -__version__ = "0.18.dev0" diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/tests/__init__.py b/exporter/opentelemetry-exporter-prometheus-remote-write/tests/__init__.py deleted file mode 100644 index b0a6f42841..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/tests/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py b/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py deleted file mode 100644 index f76596d807..0000000000 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py +++ /dev/null @@ -1,414 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import unittest -from unittest.mock import patch - -from opentelemetry.exporter.prometheus_remote_write import ( - PrometheusRemoteWriteMetricsExporter, -) -from opentelemetry.exporter.prometheus_remote_write.gen.types_pb2 import ( - Label, - TimeSeries, -) -from opentelemetry.sdk.metrics import Counter -from opentelemetry.sdk.metrics.export import ExportRecord, MetricsExportResult -from opentelemetry.sdk.metrics.export.aggregate import ( - HistogramAggregator, - LastValueAggregator, - MinMaxSumCountAggregator, - SumAggregator, - ValueObserverAggregator, -) -from opentelemetry.sdk.resources import Resource -from opentelemetry.sdk.util import get_dict_as_key - - -class TestValidation(unittest.TestCase): - # Test cases to ensure exporter parameter validation works as intended - def test_valid_standard_param(self): - exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", - ) - self.assertEqual(exporter.endpoint, "/prom/test_endpoint") - - def test_valid_basic_auth_param(self): - exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", - basic_auth={ - "username": "test_username", - "password": "test_password", - }, - ) - self.assertEqual(exporter.basic_auth["username"], "test_username") - self.assertEqual(exporter.basic_auth["password"], "test_password") - - def test_invalid_no_endpoint_param(self): - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter("") - - def test_invalid_no_username_param(self): - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", - basic_auth={"password": "test_password"}, - ) - - def test_invalid_no_password_param(self): - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", - basic_auth={"username": "test_username"}, - ) - - def test_invalid_conflicting_passwords_param(self): - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", - basic_auth={ - "username": "test_username", - "password": "test_password", - "password_file": "test_file", - }, - ) - - def test_invalid_timeout_param(self): - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", timeout=0 - ) - - def test_valid_tls_config_param(self): - tls_config = { - "ca_file": "test_ca_file", - "cert_file": "test_cert_file", - "key_file": "test_key_file", - "insecure_skip_verify": True, - } - exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", tls_config=tls_config - ) - self.assertEqual(exporter.tls_config["ca_file"], tls_config["ca_file"]) - self.assertEqual( - exporter.tls_config["cert_file"], tls_config["cert_file"] - ) - self.assertEqual( - exporter.tls_config["key_file"], tls_config["key_file"] - ) - self.assertEqual( - exporter.tls_config["insecure_skip_verify"], - tls_config["insecure_skip_verify"], - ) - - # if cert_file is provided, then key_file must also be provided - def test_invalid_tls_config_cert_only_param(self): - tls_config = {"cert_file": "value"} - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", tls_config=tls_config - ) - - # if cert_file is provided, then key_file must also be provided - def test_invalid_tls_config_key_only_param(self): - tls_config = {"cert_file": "value"} - with self.assertRaises(ValueError): - PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint", tls_config=tls_config - ) - - -class TestConversion(unittest.TestCase): - # Initializes test data that is reused across tests - def setUp(self): - self.exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint" - ) - - # Ensures conversion to timeseries function works with valid aggregation types - def test_valid_convert_to_timeseries(self): - test_records = [ - ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - SumAggregator(), - Resource({}), - ), - ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - MinMaxSumCountAggregator(), - Resource({}), - ), - ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - HistogramAggregator(), - Resource({}), - ), - ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - LastValueAggregator(), - Resource({}), - ), - ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - ValueObserverAggregator(), - Resource({}), - ), - ] - for record in test_records: - record.aggregator.update(5) - record.aggregator.take_checkpoint() - data = self.exporter._convert_to_timeseries(test_records) - self.assertIsInstance(data, list) - self.assertEqual(len(data), 13) - for timeseries in data: - self.assertIsInstance(timeseries, TimeSeries) - - # Ensures conversion to timeseries fails for unsupported aggregation types - def test_invalid_convert_to_timeseries(self): - data = self.exporter._convert_to_timeseries( - [ExportRecord(None, None, None, Resource({}))] - ) - self.assertIsInstance(data, list) - self.assertEqual(len(data), 0) - - # Ensures sum aggregator is correctly converted to timeseries - def test_convert_from_sum(self): - sum_record = ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - SumAggregator(), - Resource({}), - ) - sum_record.aggregator.update(3) - sum_record.aggregator.update(2) - sum_record.aggregator.take_checkpoint() - - expected_timeseries = self.exporter._create_timeseries( - sum_record, "testname_sum", 5.0 - ) - timeseries = self.exporter._convert_from_sum(sum_record) - self.assertEqual(timeseries[0], expected_timeseries) - - # Ensures sum min_max_count aggregator is correctly converted to timeseries - def test_convert_from_min_max_sum_count(self): - min_max_sum_count_record = ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - MinMaxSumCountAggregator(), - Resource({}), - ) - min_max_sum_count_record.aggregator.update(5) - min_max_sum_count_record.aggregator.update(1) - min_max_sum_count_record.aggregator.take_checkpoint() - - expected_min_timeseries = self.exporter._create_timeseries( - min_max_sum_count_record, "testname_min", 1.0 - ) - expected_max_timeseries = self.exporter._create_timeseries( - min_max_sum_count_record, "testname_max", 5.0 - ) - expected_sum_timeseries = self.exporter._create_timeseries( - min_max_sum_count_record, "testname_sum", 6.0 - ) - expected_count_timeseries = self.exporter._create_timeseries( - min_max_sum_count_record, "testname_count", 2.0 - ) - - timeseries = self.exporter._convert_from_min_max_sum_count( - min_max_sum_count_record - ) - self.assertEqual(timeseries[0], expected_min_timeseries) - self.assertEqual(timeseries[1], expected_max_timeseries) - self.assertEqual(timeseries[2], expected_sum_timeseries) - self.assertEqual(timeseries[3], expected_count_timeseries) - - # Ensures histogram aggregator is correctly converted to timeseries - def test_convert_from_histogram(self): - histogram_record = ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - HistogramAggregator(), - Resource({}), - ) - histogram_record.aggregator.update(5) - histogram_record.aggregator.update(2) - histogram_record.aggregator.update(-1) - histogram_record.aggregator.take_checkpoint() - - expected_le_0_timeseries = self.exporter._create_timeseries( - histogram_record, "testname_histogram", 1.0, ("le", "0") - ) - expected_le_inf_timeseries = self.exporter._create_timeseries( - histogram_record, "testname_histogram", 2.0, ("le", "+Inf") - ) - timeseries = self.exporter._convert_from_histogram(histogram_record) - self.assertEqual(timeseries[0], expected_le_0_timeseries) - self.assertEqual(timeseries[1], expected_le_inf_timeseries) - - # Ensures last value aggregator is correctly converted to timeseries - def test_convert_from_last_value(self): - last_value_record = ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - LastValueAggregator(), - Resource({}), - ) - last_value_record.aggregator.update(1) - last_value_record.aggregator.update(5) - last_value_record.aggregator.take_checkpoint() - - expected_timeseries = self.exporter._create_timeseries( - last_value_record, "testname_last", 5.0 - ) - timeseries = self.exporter._convert_from_last_value(last_value_record) - self.assertEqual(timeseries[0], expected_timeseries) - - # Ensures value observer aggregator is correctly converted to timeseries - def test_convert_from_value_observer(self): - value_observer_record = ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - None, - ValueObserverAggregator(), - Resource({}), - ) - value_observer_record.aggregator.update(5) - value_observer_record.aggregator.update(1) - value_observer_record.aggregator.update(2) - value_observer_record.aggregator.take_checkpoint() - - expected_min_timeseries = self.exporter._create_timeseries( - value_observer_record, "testname_min", 1.0 - ) - expected_max_timeseries = self.exporter._create_timeseries( - value_observer_record, "testname_max", 5.0 - ) - expected_sum_timeseries = self.exporter._create_timeseries( - value_observer_record, "testname_sum", 8.0 - ) - expected_count_timeseries = self.exporter._create_timeseries( - value_observer_record, "testname_count", 3.0 - ) - expected_last_timeseries = self.exporter._create_timeseries( - value_observer_record, "testname_last", 2.0 - ) - timeseries = self.exporter._convert_from_value_observer( - value_observer_record - ) - self.assertEqual(timeseries[0], expected_min_timeseries) - self.assertEqual(timeseries[1], expected_max_timeseries) - self.assertEqual(timeseries[2], expected_sum_timeseries) - self.assertEqual(timeseries[3], expected_count_timeseries) - self.assertEqual(timeseries[4], expected_last_timeseries) - - # Ensures quantile aggregator is correctly converted to timeseries - # TODO: Add test_convert_from_quantile once method is implemented - - # Ensures timeseries produced contains appropriate sample and labels - def test_create_timeseries(self): - def create_label(name, value): - label = Label() - label.name = name - label.value = value - return label - - sum_aggregator = SumAggregator() - sum_aggregator.update(5) - sum_aggregator.take_checkpoint() - export_record = ExportRecord( - Counter("testname", "testdesc", "testunit", int, None), - get_dict_as_key({"record_name": "record_value"}), - sum_aggregator, - Resource({"resource_name": "resource_value"}), - ) - - expected_timeseries = TimeSeries() - expected_timeseries.labels.append( # pylint:disable=E1101 - create_label("__name__", "testname") - ) - expected_timeseries.labels.append( # pylint:disable=E1101 - create_label("resource_name", "resource_value") - ) - expected_timeseries.labels.append( # pylint:disable=E1101 - create_label("record_name", "record_value") - ) - - sample = expected_timeseries.samples.add() # pylint:disable=E1101 - sample.timestamp = int(sum_aggregator.last_update_timestamp / 1000000) - sample.value = 5.0 - - timeseries = self.exporter._create_timeseries( - export_record, "testname", 5.0 - ) - self.assertEqual(timeseries, expected_timeseries) - - -class TestExport(unittest.TestCase): - # Initializes test data that is reused across tests - def setUp(self): - self.exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="/prom/test_endpoint" - ) - - # Ensures export is successful with valid export_records and config - @patch("requests.post") - def test_valid_export(self, mock_post): - mock_post.return_value.configure_mock(**{"status_code": 200}) - test_metric = Counter("testname", "testdesc", "testunit", int, None) - labels = get_dict_as_key({"environment": "testing"}) - record = ExportRecord( - test_metric, labels, SumAggregator(), Resource({}) - ) - result = self.exporter.export([record]) - self.assertIs(result, MetricsExportResult.SUCCESS) - self.assertEqual(mock_post.call_count, 1) - - result = self.exporter.export([]) - self.assertIs(result, MetricsExportResult.SUCCESS) - - def test_invalid_export(self): - record = ExportRecord(None, None, None, None) - result = self.exporter.export([record]) - self.assertIs(result, MetricsExportResult.FAILURE) - - @patch("requests.post") - def test_valid_send_message(self, mock_post): - mock_post.return_value.configure_mock(**{"ok": True}) - result = self.exporter._send_message(bytes(), {}) - self.assertEqual(mock_post.call_count, 1) - self.assertEqual(result, MetricsExportResult.SUCCESS) - - def test_invalid_send_message(self): - result = self.exporter._send_message(bytes(), {}) - self.assertEqual(result, MetricsExportResult.FAILURE) - - # Verifies that build_message calls snappy.compress and returns SerializedString - @patch("snappy.compress", return_value=bytes()) - def test_build_message(self, mock_compress): - message = self.exporter._build_message([TimeSeries()]) - self.assertEqual(mock_compress.call_count, 1) - self.assertIsInstance(message, bytes) - - # Ensure correct headers are added when valid config is provided - def test_build_headers(self): - self.exporter.headers = {"Custom Header": "test_header"} - - headers = self.exporter._build_headers() - self.assertEqual(headers["Content-Encoding"], "snappy") - self.assertEqual(headers["Content-Type"], "application/x-protobuf") - self.assertEqual(headers["X-Prometheus-Remote-Write-Version"], "0.1.0") - self.assertEqual(headers["Custom Header"], "test_header") diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py index f8ed60ee55..87b0ae2816 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -23,16 +23,11 @@ from opentelemetry.instrumentation.django.middleware import _DjangoMiddleware from opentelemetry.instrumentation.django.version import __version__ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor -from opentelemetry.instrumentation.metric import ( - HTTPMetricRecorder, - HTTPMetricType, - MetricMixin, -) _logger = getLogger(__name__) -class DjangoInstrumentor(BaseInstrumentor, MetricMixin): +class DjangoInstrumentor(BaseInstrumentor): """An instrumentor for Django See `BaseInstrumentor` @@ -62,11 +57,6 @@ def _instrument(self, **kwargs): settings_middleware = list(settings_middleware) settings_middleware.insert(0, self._opentelemetry_middleware) - self.init_metrics( - __name__, __version__, - ) - metric_recorder = HTTPMetricRecorder(self.meter, HTTPMetricType.SERVER) - setattr(settings, "OTEL_METRIC_RECORDER", metric_recorder) setattr(settings, "MIDDLEWARE", settings_middleware) def _uninstrument(self, **kwargs): diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py index a167cb9ab4..cf9ffcc8a8 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py @@ -15,8 +15,6 @@ from logging import getLogger from time import time -from django.conf import settings - from opentelemetry.context import attach, detach from opentelemetry.instrumentation.django.version import __version__ from opentelemetry.instrumentation.utils import extract_attributes_from_object @@ -86,21 +84,6 @@ def _get_span_name(request): except Resolver404: return "HTTP {}".format(request.method) - @staticmethod - def _get_metric_labels_from_attributes(attributes): - labels = {} - labels["http.method"] = attributes.get("http.method", "") - for attrs in _attributes_by_preference: - labels_from_attributes = { - attr: attributes.get(attr, None) for attr in attrs - } - if set(attrs).issubset(attributes.keys()): - labels.update(labels_from_attributes) - break - if attributes.get("http.flavor"): - labels["http.flavor"] = attributes.get("http.flavor") - return labels - def process_request(self, request): # request.META is a dictionary containing all available HTTP headers # Read more about request.META here: @@ -127,10 +110,6 @@ def process_request(self, request): ) attributes = collect_request_attributes(request_meta) - # pylint:disable=W0212 - request._otel_labels = self._get_metric_labels_from_attributes( - attributes - ) if span.is_recording(): attributes = extract_attributes_from_object( @@ -186,10 +165,7 @@ def process_response(self, request, response): "{} {}".format(response.status_code, response.reason_phrase), response, ) - # pylint:disable=W0212 - request._otel_labels["http.status_code"] = str( - response.status_code - ) + request.META.pop(self._environ_span_key) exception = request.META.pop(self._environ_exception_key, None) @@ -209,13 +185,4 @@ def process_response(self, request, response): detach(request.environ.get(self._environ_token)) request.META.pop(self._environ_token) - try: - metric_recorder = getattr(settings, "OTEL_METRIC_RECORDER", None) - if metric_recorder is not None: - # pylint:disable=W0212 - metric_recorder.record_server_duration_range( - request._otel_start_time, time(), request._otel_labels - ) - except Exception as ex: # pylint: disable=W0703 - _logger.warning("Error recording duration metrics: %s", ex) return response diff --git a/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py b/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py index 21cbf53346..6d59197dd2 100644 --- a/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py @@ -22,7 +22,6 @@ from django.test.utils import setup_test_environment, teardown_test_environment from opentelemetry.instrumentation.django import DjangoInstrumentor -from opentelemetry.sdk.util import get_dict_as_key from opentelemetry.test.test_base import TestBase from opentelemetry.test.wsgitestutil import WsgiTestBase from opentelemetry.trace import SpanKind @@ -142,26 +141,6 @@ def test_traced_get(self): self.assertEqual(span.attributes["http.status_code"], 200) self.assertEqual(span.attributes["http.status_text"], "OK") - self.assertIsNotNone(_django_instrumentor.meter) - self.assertEqual(len(_django_instrumentor.meter.instruments), 1) - recorder = list(_django_instrumentor.meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.flavor": "1.1", - "http.method": "GET", - "http.status_code": "200", - "http.url": "http://testserver/traced/", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) - self.assertGreaterEqual(view_data.aggregator.current.sum, 0) - def test_not_recording(self): mock_tracer = Mock() mock_span = Mock() @@ -220,8 +199,6 @@ def test_error(self): self.assertEqual(span.attributes["http.route"], "^error/") self.assertEqual(span.attributes["http.scheme"], "http") self.assertEqual(span.attributes["http.status_code"], 500) - self.assertIsNotNone(_django_instrumentor.meter) - self.assertEqual(len(_django_instrumentor.meter.instruments), 1) self.assertEqual(len(span.events), 1) event = span.events[0] @@ -229,23 +206,6 @@ def test_error(self): self.assertEqual(event.attributes["exception.type"], "ValueError") self.assertEqual(event.attributes["exception.message"], "error") - recorder = list(_django_instrumentor.meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.flavor": "1.1", - "http.method": "GET", - "http.status_code": "500", - "http.url": "http://testserver/error/", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) - def test_exclude_lists(self): client = Client() client.get("/excluded_arg/123") diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py index eeffea1b87..889c022b61 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py @@ -33,10 +33,6 @@ SimpleExportSpanProcessor, ) - from opentelemetry import metrics - from opentelemetry.sdk.metrics import MeterProvider - from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter - try: from .gen import helloworld_pb2, helloworld_pb2_grpc except ImportError: @@ -47,13 +43,7 @@ SimpleExportSpanProcessor(ConsoleSpanExporter()) ) - # Set meter provider to opentelemetry-sdk's MeterProvider - metrics.set_meter_provider(MeterProvider()) - - # Optional - export GRPC specific metrics (latency, bytes in/out, errors) by passing an exporter - instrumentor = GrpcInstrumentorClient().instrument( - exporter = ConsoleMetricsExporter(), - interval = 10) + instrumentor = GrpcInstrumentorClient().instrument() def run(): with grpc.insecure_channel("localhost:50051") as channel: @@ -128,8 +118,6 @@ def serve(): interceptors = [server_interceptor()]) """ -from functools import partial - import grpc # pylint:disable=import-self from wrapt import wrap_function_wrapper as _wrap @@ -202,39 +190,28 @@ def _which_channel(self, kwargs): return tuple(types) def _instrument(self, **kwargs): - exporter = kwargs.get("exporter", None) - interval = kwargs.get("interval", 30) for ctype in self._which_channel(kwargs): _wrap( - "grpc", ctype, partial(self.wrapper_fn, exporter, interval), + "grpc", ctype, self.wrapper_fn, ) def _uninstrument(self, **kwargs): for ctype in self._which_channel(kwargs): unwrap(grpc, ctype) - def wrapper_fn( - self, exporter, interval, original_func, instance, args, kwargs - ): + def wrapper_fn(self, original_func, instance, args, kwargs): channel = original_func(*args, **kwargs) tracer_provider = kwargs.get("tracer_provider") return intercept_channel( - channel, - client_interceptor( - tracer_provider=tracer_provider, - exporter=exporter, - interval=interval, - ), + channel, client_interceptor(tracer_provider=tracer_provider), ) -def client_interceptor(tracer_provider=None, exporter=None, interval=30): +def client_interceptor(tracer_provider=None): """Create a gRPC client channel interceptor. Args: tracer: The tracer to use to create client-side spans. - exporter: The exporter that will receive client metrics - interval: Time between every export call Returns: An invocation-side interceptor object. @@ -243,7 +220,7 @@ def client_interceptor(tracer_provider=None, exporter=None, interval=30): tracer = trace.get_tracer(__name__, __version__, tracer_provider) - return _client.OpenTelemetryClientInterceptor(tracer, exporter, interval) + return _client.OpenTelemetryClientInterceptor(tracer) def server_interceptor(tracer_provider=None): diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py index 3cf4c74df7..c69c15f563 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py @@ -24,13 +24,9 @@ import grpc -from opentelemetry import metrics, propagators, trace +from opentelemetry import propagators, trace from opentelemetry.instrumentation.grpc import grpcext -from opentelemetry.instrumentation.grpc._utilities import ( - RpcInfo, - TimedMetricRecorder, -) -from opentelemetry.sdk.metrics.export.controller import PushController +from opentelemetry.instrumentation.grpc._utilities import RpcInfo from opentelemetry.trace.status import Status, StatusCode @@ -66,7 +62,7 @@ def append_metadata( propagators.inject(append_metadata, metadata) -def _make_future_done_callback(span, rpc_info, client_info, metrics_recorder): +def _make_future_done_callback(span, rpc_info): def callback(response_future): with span: code = response_future.code() @@ -75,10 +71,6 @@ def callback(response_future): return response = response_future.result() rpc_info.response = response - if "ByteSize" in dir(response): - metrics_recorder.record_bytes_in( - response.ByteSize(), client_info.full_method - ) return callback @@ -86,21 +78,9 @@ def callback(response_future): class OpenTelemetryClientInterceptor( grpcext.UnaryClientInterceptor, grpcext.StreamClientInterceptor ): - def __init__(self, tracer, exporter, interval): + def __init__(self, tracer): self._tracer = tracer - self._accumulator = None - if exporter and interval: - self._accumulator = metrics.get_meter(__name__) - self.controller = PushController( - accumulator=self._accumulator, - exporter=exporter, - interval=interval, - ) - self._metrics_recorder = TimedMetricRecorder( - self._accumulator, "client", - ) - def _start_span(self, method): service, meth = method.lstrip("/").split("/", 1) attributes = { @@ -115,17 +95,12 @@ def _start_span(self, method): ) # pylint:disable=no-self-use - def _trace_result(self, guarded_span, rpc_info, result, client_info): + def _trace_result(self, guarded_span, rpc_info, result): # If the RPC is called asynchronously, release the guard and add a # callback so that the span can be finished once the future is done. if isinstance(result, grpc.Future): result.add_done_callback( - _make_future_done_callback( - guarded_span.release(), - rpc_info, - client_info, - self._metrics_recorder, - ) + _make_future_done_callback(guarded_span.release(), rpc_info) ) return result response = result @@ -137,24 +112,11 @@ def _trace_result(self, guarded_span, rpc_info, result, client_info): response = result[0] rpc_info.response = response - if "ByteSize" in dir(response): - self._metrics_recorder.record_bytes_in( - response.ByteSize(), client_info.full_method - ) - return result def _start_guarded_span(self, *args, **kwargs): return _GuardedSpan(self._start_span(*args, **kwargs)) - def _bytes_out_iterator_wrapper(self, iterator, client_info): - for request in iterator: - if "ByteSize" in dir(request): - self._metrics_recorder.record_bytes_out( - request.ByteSize(), client_info.full_method - ) - yield request - def intercept_unary(self, request, metadata, client_info, invoker): if not metadata: mutable_metadata = OrderedDict() @@ -162,40 +124,28 @@ def intercept_unary(self, request, metadata, client_info, invoker): mutable_metadata = OrderedDict(metadata) with self._start_guarded_span(client_info.full_method) as guarded_span: - with self._metrics_recorder.record_latency( - client_info.full_method - ): - _inject_span_context(mutable_metadata) - metadata = tuple(mutable_metadata.items()) - - # If protobuf is used, we can record the bytes in/out. Otherwise, we have no way - # to get the size of the request/response properly, so don't record anything - if "ByteSize" in dir(request): - self._metrics_recorder.record_bytes_out( - request.ByteSize(), client_info.full_method - ) - - rpc_info = RpcInfo( - full_method=client_info.full_method, - metadata=metadata, - timeout=client_info.timeout, - request=request, - ) + _inject_span_context(mutable_metadata) + metadata = tuple(mutable_metadata.items()) + + rpc_info = RpcInfo( + full_method=client_info.full_method, + metadata=metadata, + timeout=client_info.timeout, + request=request, + ) - try: - result = invoker(request, metadata) - except grpc.RpcError as err: - guarded_span.generated_span.set_status( - Status(StatusCode.ERROR) - ) - guarded_span.generated_span.set_attribute( - "rpc.grpc.status_code", err.code().value[0] - ) - raise err - - return self._trace_result( - guarded_span, rpc_info, result, client_info + try: + result = invoker(request, metadata) + except grpc.RpcError as err: + guarded_span.generated_span.set_status( + Status(StatusCode.ERROR) + ) + guarded_span.generated_span.set_attribute( + "rpc.grpc.status_code", err.code().value[0] ) + raise err + + return self._trace_result(guarded_span, rpc_info, result) # For RPCs that stream responses, the result can be a generator. To record # the span across the generated responses and detect any errors, we wrap @@ -209,45 +159,26 @@ def _intercept_server_stream( mutable_metadata = OrderedDict(metadata) with self._start_span(client_info.full_method) as span: - with self._metrics_recorder.record_latency( - client_info.full_method - ): - _inject_span_context(mutable_metadata) - metadata = tuple(mutable_metadata.items()) - rpc_info = RpcInfo( - full_method=client_info.full_method, - metadata=metadata, - timeout=client_info.timeout, - ) + _inject_span_context(mutable_metadata) + metadata = tuple(mutable_metadata.items()) + rpc_info = RpcInfo( + full_method=client_info.full_method, + metadata=metadata, + timeout=client_info.timeout, + ) + + if client_info.is_client_stream: + rpc_info.request = request_or_iterator + + try: + result = invoker(request_or_iterator, metadata) - if client_info.is_client_stream: - rpc_info.request = request_or_iterator - request_or_iterator = self._bytes_out_iterator_wrapper( - request_or_iterator, client_info - ) - else: - if "ByteSize" in dir(request_or_iterator): - self._metrics_recorder.record_bytes_out( - request_or_iterator.ByteSize(), - client_info.full_method, - ) - - try: - result = invoker(request_or_iterator, metadata) - - # Rewrap the result stream into a generator, and record the bytes received - for response in result: - if "ByteSize" in dir(response): - self._metrics_recorder.record_bytes_in( - response.ByteSize(), client_info.full_method - ) - yield response - except grpc.RpcError as err: - span.set_status(Status(StatusCode.ERROR)) - span.set_attribute( - "rpc.grpc.status_code", err.code().value[0] - ) - raise err + for response in result: + yield response + except grpc.RpcError as err: + span.set_status(Status(StatusCode.ERROR)) + span.set_attribute("rpc.grpc.status_code", err.code().value[0]) + raise err def intercept_stream( self, request_or_iterator, metadata, client_info, invoker @@ -263,35 +194,26 @@ def intercept_stream( mutable_metadata = OrderedDict(metadata) with self._start_guarded_span(client_info.full_method) as guarded_span: - with self._metrics_recorder.record_latency( - client_info.full_method - ): - _inject_span_context(mutable_metadata) - metadata = tuple(mutable_metadata.items()) - rpc_info = RpcInfo( - full_method=client_info.full_method, - metadata=metadata, - timeout=client_info.timeout, - request=request_or_iterator, - ) + _inject_span_context(mutable_metadata) + metadata = tuple(mutable_metadata.items()) + rpc_info = RpcInfo( + full_method=client_info.full_method, + metadata=metadata, + timeout=client_info.timeout, + request=request_or_iterator, + ) - rpc_info.request = request_or_iterator + rpc_info.request = request_or_iterator - request_or_iterator = self._bytes_out_iterator_wrapper( - request_or_iterator, client_info + try: + result = invoker(request_or_iterator, metadata) + except grpc.RpcError as err: + guarded_span.generated_span.set_status( + Status(StatusCode.ERROR) ) - - try: - result = invoker(request_or_iterator, metadata) - except grpc.RpcError as err: - guarded_span.generated_span.set_status( - Status(StatusCode.ERROR) - ) - guarded_span.generated_span.set_attribute( - "rpc.grpc.status_code", err.code().value[0], - ) - raise err - - return self._trace_result( - guarded_span, rpc_info, result, client_info + guarded_span.generated_span.set_attribute( + "rpc.grpc.status_code", err.code().value[0], ) + raise err + + return self._trace_result(guarded_span, rpc_info, result) diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py index 078a98b9e4..b6ff7d311a 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py @@ -14,11 +14,6 @@ """Internal utilities.""" -from contextlib import contextmanager -from time import time - -import grpc - class RpcInfo: def __init__( @@ -36,68 +31,3 @@ def __init__( self.request = request self.response = response self.error = error - - -class TimedMetricRecorder: - def __init__(self, meter, span_kind): - self._meter = meter - service_name = "grpcio" - self._span_kind = span_kind - - if self._meter: - self._duration = self._meter.create_valuerecorder( - name="{}/{}/duration".format(service_name, span_kind), - description="Duration of grpc requests to the server", - unit="ms", - value_type=float, - ) - self._error_count = self._meter.create_counter( - name="{}/{}/errors".format(service_name, span_kind), - description="Number of errors that were returned from the server", - unit="1", - value_type=int, - ) - self._bytes_in = self._meter.create_counter( - name="{}/{}/bytes_in".format(service_name, span_kind), - description="Number of bytes received from the server", - unit="by", - value_type=int, - ) - self._bytes_out = self._meter.create_counter( - name="{}/{}/bytes_out".format(service_name, span_kind), - description="Number of bytes sent out through gRPC", - unit="by", - value_type=int, - ) - - def record_bytes_in(self, bytes_in, method): - if self._meter: - labels = {"rpc.method": method} - self._bytes_in.add(bytes_in, labels) - - def record_bytes_out(self, bytes_out, method): - if self._meter: - labels = {"rpc.method": method} - self._bytes_out.add(bytes_out, labels) - - @contextmanager - def record_latency(self, method): - start_time = time() - labels = { - "rpc.method": method, - "rpc.system": "grpc", - "rpc.grpc.status_code": grpc.StatusCode.OK.name, - } - try: - yield labels - except grpc.RpcError as exc: # pylint:disable=no-member - if self._meter: - # pylint: disable=no-member - labels["rpc.grpc.status_code"] = exc.code().name - self._error_count.add(1, labels) - labels["error"] = "true" - raise - finally: - if self._meter: - elapsed_time = (time() - start_time) * 1000 - self._duration.record(elapsed_time, labels) diff --git a/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py b/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py index a13a9a99b5..41a27e1c27 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py @@ -20,10 +20,6 @@ import opentelemetry.instrumentation.grpc from opentelemetry import trace from opentelemetry.instrumentation.grpc import GrpcInstrumentorClient -from opentelemetry.sdk.metrics.export.aggregate import ( - MinMaxSumCountAggregator, - SumAggregator, -) from opentelemetry.test.test_base import TestBase from ._client import ( @@ -38,9 +34,7 @@ class TestClientProto(TestBase): def setUp(self): super().setUp() - GrpcInstrumentorClient().instrument( - exporter=self.memory_metrics_exporter - ) + GrpcInstrumentorClient().instrument() self.server = create_test_server(25565) self.server.start() self.channel = grpc.insecure_channel("localhost:25565") @@ -49,57 +43,9 @@ def setUp(self): def tearDown(self): super().tearDown() GrpcInstrumentorClient().uninstrument() - self.memory_metrics_exporter.clear() self.server.stop(None) self.channel.close() - def _verify_success_records(self, num_bytes_out, num_bytes_in, method): - # pylint: disable=protected-access,no-member - self.channel._interceptor.controller.tick() - records = self.memory_metrics_exporter.get_exported_metrics() - self.assertEqual(len(records), 3) - - bytes_out = None - bytes_in = None - duration = None - - for record in records: - if record.instrument.name == "grpcio/client/duration": - duration = record - elif record.instrument.name == "grpcio/client/bytes_out": - bytes_out = record - elif record.instrument.name == "grpcio/client/bytes_in": - bytes_in = record - - self.assertIsNotNone(bytes_out) - self.assertEqual(bytes_out.instrument.name, "grpcio/client/bytes_out") - self.assertEqual(bytes_out.labels, (("rpc.method", method),)) - - self.assertIsNotNone(bytes_in) - self.assertEqual(bytes_in.instrument.name, "grpcio/client/bytes_in") - self.assertEqual(bytes_in.labels, (("rpc.method", method),)) - - self.assertIsNotNone(duration) - self.assertEqual(duration.instrument.name, "grpcio/client/duration") - self.assertSequenceEqual( - sorted(duration.labels), - [ - ("rpc.grpc.status_code", grpc.StatusCode.OK.name), - ("rpc.method", method), - ("rpc.system", "grpc"), - ], - ) - - self.assertEqual(type(bytes_out.aggregator), SumAggregator) - self.assertEqual(type(bytes_in.aggregator), SumAggregator) - self.assertEqual(type(duration.aggregator), MinMaxSumCountAggregator) - - self.assertEqual(bytes_out.aggregator.checkpoint, num_bytes_out) - self.assertEqual(bytes_in.aggregator.checkpoint, num_bytes_in) - - self.assertEqual(duration.aggregator.checkpoint.count, 1) - self.assertGreaterEqual(duration.aggregator.checkpoint.sum, 0) - def test_unary_unary(self): simple_method(self._stub) spans = self.memory_exporter.get_finished_spans() @@ -114,8 +60,6 @@ def test_unary_unary(self): span, opentelemetry.instrumentation.grpc ) - self._verify_success_records(8, 8, "/GRPCTestServer/SimpleMethod") - self.assert_span_has_attributes( span, { @@ -140,10 +84,6 @@ def test_unary_stream(self): span, opentelemetry.instrumentation.grpc ) - self._verify_success_records( - 8, 40, "/GRPCTestServer/ServerStreamingMethod" - ) - self.assert_span_has_attributes( span, { @@ -168,10 +108,6 @@ def test_stream_unary(self): span, opentelemetry.instrumentation.grpc ) - self._verify_success_records( - 40, 8, "/GRPCTestServer/ClientStreamingMethod" - ) - self.assert_span_has_attributes( span, { @@ -198,10 +134,6 @@ def test_stream_stream(self): span, opentelemetry.instrumentation.grpc ) - self._verify_success_records( - 40, 40, "/GRPCTestServer/BidirectionalStreamingMethod" - ) - self.assert_span_has_attributes( span, { @@ -212,65 +144,10 @@ def test_stream_stream(self): }, ) - def _verify_error_records(self, method): - # pylint: disable=protected-access,no-member - self.channel._interceptor.controller.tick() - records = self.memory_metrics_exporter.get_exported_metrics() - self.assertEqual(len(records), 3) - - bytes_out = None - errors = None - duration = None - - for record in records: - if record.instrument.name == "grpcio/client/duration": - duration = record - elif record.instrument.name == "grpcio/client/bytes_out": - bytes_out = record - elif record.instrument.name == "grpcio/client/errors": - errors = record - - self.assertIsNotNone(bytes_out) - self.assertIsNotNone(errors) - self.assertIsNotNone(duration) - - self.assertEqual(errors.instrument.name, "grpcio/client/errors") - self.assertSequenceEqual( - sorted(errors.labels), - sorted( - ( - ( - "rpc.grpc.status_code", - grpc.StatusCode.INVALID_ARGUMENT.name, - ), - ("rpc.method", method), - ("rpc.system", "grpc"), - ) - ), - ) - self.assertEqual(errors.aggregator.checkpoint, 1) - - self.assertSequenceEqual( - sorted(duration.labels), - sorted( - ( - ("error", "true"), - ("rpc.method", method), - ("rpc.system", "grpc"), - ( - "rpc.grpc.status_code", - grpc.StatusCode.INVALID_ARGUMENT.name, - ), - ) - ), - ) - def test_error_simple(self): with self.assertRaises(grpc.RpcError): simple_method(self._stub, error=True) - self._verify_error_records("/GRPCTestServer/SimpleMethod") - spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 1) span = spans[0] @@ -282,7 +159,6 @@ def test_error_stream_unary(self): with self.assertRaises(grpc.RpcError): client_streaming_method(self._stub, error=True) - self._verify_error_records("/GRPCTestServer/ClientStreamingMethod") spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 1) span = spans[0] @@ -294,8 +170,6 @@ def test_error_unary_stream(self): with self.assertRaises(grpc.RpcError): server_streaming_method(self._stub, error=True) - self._verify_error_records("/GRPCTestServer/ServerStreamingMethod") - spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 1) span = spans[0] @@ -307,43 +181,9 @@ def test_error_stream_stream(self): with self.assertRaises(grpc.RpcError): bidirectional_streaming_method(self._stub, error=True) - self._verify_error_records( - "/GRPCTestServer/BidirectionalStreamingMethod" - ) - spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 1) span = spans[0] self.assertIs( span.status.status_code, trace.status.StatusCode.ERROR, ) - - -class TestClientNoMetrics(TestBase): - def setUp(self): - super().setUp() - GrpcInstrumentorClient().instrument() - self.server = create_test_server(25565) - self.server.start() - self.channel = grpc.insecure_channel("localhost:25565") - self._stub = test_server_pb2_grpc.GRPCTestServerStub(self.channel) - - def tearDown(self): - super().tearDown() - GrpcInstrumentorClient().uninstrument() - self.memory_metrics_exporter.clear() - self.server.stop(None) - - def test_unary_unary(self): - simple_method(self._stub) - spans = self.memory_exporter.get_finished_spans() - self.assertEqual(len(spans), 1) - span = spans[0] - - self.assertEqual(span.name, "/GRPCTestServer/SimpleMethod") - self.assertIs(span.kind, trace.SpanKind.CLIENT) - - # Check version and name in span's instrumentation info - self.check_span_instrumentation_info( - span, opentelemetry.instrumentation.grpc - ) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 3781545e8b..b44468e763 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -44,11 +44,6 @@ from opentelemetry import context, propagators from opentelemetry.instrumentation.instrumentor import BaseInstrumentor -from opentelemetry.instrumentation.metric import ( - HTTPMetricRecorder, - HTTPMetricType, - MetricMixin, -) from opentelemetry.instrumentation.requests.version import __version__ from opentelemetry.instrumentation.utils import http_status_to_status_code from opentelemetry.trace import SpanKind, get_tracer @@ -127,8 +122,6 @@ def _instrumented_requests_call( if not span_name or not isinstance(span_name, str): span_name = get_default_span_name(method) - recorder = RequestsInstrumentor().metric_recorder - labels = {} labels["http.method"] = method labels["http.url"] = url @@ -137,47 +130,40 @@ def _instrumented_requests_call( __name__, __version__, tracer_provider ).start_as_current_span(span_name, kind=SpanKind.CLIENT) as span: exception = None - with recorder.record_client_duration(labels): - if span.is_recording(): - span.set_attribute("http.method", method) - span.set_attribute("http.url", url) + if span.is_recording(): + span.set_attribute("http.method", method) + span.set_attribute("http.url", url) - headers = get_or_create_headers() - propagators.inject(type(headers).__setitem__, headers) + headers = get_or_create_headers() + propagators.inject(type(headers).__setitem__, headers) - token = context.attach( - context.set_value( - _SUPPRESS_REQUESTS_INSTRUMENTATION_KEY, True + token = context.attach( + context.set_value(_SUPPRESS_REQUESTS_INSTRUMENTATION_KEY, True) + ) + try: + result = call_wrapped() # *** PROCEED + except Exception as exc: # pylint: disable=W0703 + exception = exc + result = getattr(exc, "response", None) + finally: + context.detach(token) + + if isinstance(result, Response): + if span.is_recording(): + span.set_attribute("http.status_code", result.status_code) + span.set_attribute("http.status_text", result.reason) + span.set_status( + Status(http_status_to_status_code(result.status_code)) ) - ) - try: - result = call_wrapped() # *** PROCEED - except Exception as exc: # pylint: disable=W0703 - exception = exc - result = getattr(exc, "response", None) - finally: - context.detach(token) - - if isinstance(result, Response): - if span.is_recording(): - span.set_attribute( - "http.status_code", result.status_code - ) - span.set_attribute("http.status_text", result.reason) - span.set_status( - Status( - http_status_to_status_code(result.status_code) - ) - ) - labels["http.status_code"] = str(result.status_code) - if result.raw and result.raw.version: - labels["http.flavor"] = ( - str(result.raw.version)[:1] - + "." - + str(result.raw.version)[:-1] - ) - if span_callback is not None: - span_callback(span, result) + labels["http.status_code"] = str(result.status_code) + if result.raw and result.raw.version: + labels["http.flavor"] = ( + str(result.raw.version)[:1] + + "." + + str(result.raw.version)[:-1] + ) + if span_callback is not None: + span_callback(span, result) if exception is not None: raise exception.with_traceback(exception.__traceback__) @@ -219,7 +205,7 @@ def get_default_span_name(method): return "HTTP {}".format(method).strip() -class RequestsInstrumentor(BaseInstrumentor, MetricMixin): +class RequestsInstrumentor(BaseInstrumentor): """An instrumentor for requests See `BaseInstrumentor` """ @@ -240,13 +226,6 @@ def _instrument(self, **kwargs): span_callback=kwargs.get("span_callback"), name_callback=kwargs.get("name_callback"), ) - self.init_metrics( - __name__, __version__, - ) - # pylint: disable=W0201 - self.metric_recorder = HTTPMetricRecorder( - self.meter, HTTPMetricType.CLIENT - ) def _uninstrument(self, **kwargs): _uninstrument() diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index b981655db0..3763124981 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -22,7 +22,6 @@ from opentelemetry import context, propagators, trace from opentelemetry.instrumentation.requests import RequestsInstrumentor from opentelemetry.sdk import resources -from opentelemetry.sdk.util import get_dict_as_key from opentelemetry.test.mock_textmap import MockTextMapPropagator from opentelemetry.test.test_base import TestBase from opentelemetry.trace.status import StatusCode @@ -92,26 +91,6 @@ def test_basic(self): span, opentelemetry.instrumentation.requests ) - self.assertIsNotNone(RequestsInstrumentor().meter) - self.assertEqual(len(RequestsInstrumentor().meter.instruments), 1) - recorder = list(RequestsInstrumentor().meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.flavor": "1.1", - "http.method": "GET", - "http.status_code": "200", - "http.url": "http://httpbin.org/status/200", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) - self.assertGreaterEqual(view_data.aggregator.current.sum, 0) - def test_name_callback(self): def name_callback(method, url): return "GET" + url @@ -289,23 +268,6 @@ def test_requests_exception_without_response(self, *_, **__): ) self.assertEqual(span.status.status_code, StatusCode.ERROR) - self.assertIsNotNone(RequestsInstrumentor().meter) - self.assertEqual(len(RequestsInstrumentor().meter.instruments), 1) - recorder = list(RequestsInstrumentor().meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.method": "GET", - "http.url": "http://httpbin.org/status/200", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) - mocked_response = requests.Response() mocked_response.status_code = 500 mocked_response.reason = "Internal Server Error" @@ -324,23 +286,6 @@ def test_requests_exception_without_proper_response_type(self, *_, **__): ) self.assertEqual(span.status.status_code, StatusCode.ERROR) - self.assertIsNotNone(RequestsInstrumentor().meter) - self.assertEqual(len(RequestsInstrumentor().meter.instruments), 1) - recorder = list(RequestsInstrumentor().meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.method": "GET", - "http.url": "http://httpbin.org/status/200", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) - mocked_response = requests.Response() mocked_response.status_code = 500 mocked_response.reason = "Internal Server Error" @@ -364,23 +309,6 @@ def test_requests_exception_with_response(self, *_, **__): }, ) self.assertEqual(span.status.status_code, StatusCode.ERROR) - self.assertIsNotNone(RequestsInstrumentor().meter) - self.assertEqual(len(RequestsInstrumentor().meter.instruments), 1) - recorder = list(RequestsInstrumentor().meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.method": "GET", - "http.status_code": "500", - "http.url": "http://httpbin.org/status/200", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) @mock.patch("requests.adapters.HTTPAdapter.send", side_effect=Exception) def test_requests_basic_exception(self, *_, **__): diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/LICENSE b/instrumentation/opentelemetry-instrumentation-system-metrics/LICENSE deleted file mode 100644 index 261eeb9e9f..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/MANIFEST.in b/instrumentation/opentelemetry-instrumentation-system-metrics/MANIFEST.in deleted file mode 100644 index aed3e33273..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/MANIFEST.in +++ /dev/null @@ -1,9 +0,0 @@ -graft src -graft tests -global-exclude *.pyc -global-exclude *.pyo -global-exclude __pycache__/* -include CHANGELOG.md -include MANIFEST.in -include README.rst -include LICENSE diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/README.rst b/instrumentation/opentelemetry-instrumentation-system-metrics/README.rst deleted file mode 100644 index 7a6c65b59b..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/README.rst +++ /dev/null @@ -1,24 +0,0 @@ -OpenTelemetry System Metrics Instrumentation -============================================ - -|pypi| - -.. |pypi| image:: https://badge.fury.io/py/opentelemetry-instrumentation-system-metrics.svg - :target: https://pypi.org/project/opentelemetry-instrumentation-system-metrics/ - -Instrumentation to collect system performance metrics. - - -Installation ------------- - -:: - - pip install opentelemetry-instrumentation-system-metrics - - -References ----------- -* `OpenTelemetry System Metrics Instrumentation `_ -* `OpenTelemetry Project `_ - diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/setup.cfg b/instrumentation/opentelemetry-instrumentation-system-metrics/setup.cfg deleted file mode 100644 index f0c0407a33..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/setup.cfg +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -[metadata] -name = opentelemetry-instrumentation-system-metrics -description = OpenTelemetry System Metrics Instrumentation -long_description = file: README.rst -long_description_content_type = text/x-rst -author = OpenTelemetry Authors -author_email = cncf-opentelemetry-contributors@lists.cncf.io -url = https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-system-metrics -platforms = any -license = Apache-2.0 -classifiers = - Development Status :: 4 - Beta - Intended Audience :: Developers - License :: OSI Approved :: Apache Software License - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.5 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - -[options] -python_requires = >=3.5 -package_dir= - =src -packages=find_namespace: -install_requires = - opentelemetry-api == 0.18.dev0 - opentelemetry-sdk == 0.18.dev0 - psutil ~= 5.7.0 - -[options.extras_require] -test = - opentelemetry-test == 0.18.dev0 - -[options.packages.find] -where = src diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/setup.py b/instrumentation/opentelemetry-instrumentation-system-metrics/setup.py deleted file mode 100644 index f0bbf9eff0..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/setup.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import os - -import setuptools - -BASE_DIR = os.path.dirname(__file__) -VERSION_FILENAME = os.path.join( - BASE_DIR, - "src", - "opentelemetry", - "instrumentation", - "system_metrics", - "version.py", -) -PACKAGE_INFO = {} -with open(VERSION_FILENAME) as f: - exec(f.read(), PACKAGE_INFO) - -setuptools.setup(version=PACKAGE_INFO["__version__"]) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py deleted file mode 100644 index cedc791134..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py +++ /dev/null @@ -1,683 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Instrument to report system (CPU, memory, network) and -process (CPU, memory, garbage collection) metrics. By default, the -following metrics are configured: - -.. code:: python - - { - "system.cpu.time": ["idle", "user", "system", "irq"], - "system.cpu.utilization": ["idle", "user", "system", "irq"], - "system.memory.usage": ["used", "free", "cached"], - "system.memory.utilization": ["used", "free", "cached"], - "system.swap.usage": ["used", "free"], - "system.swap.utilization": ["used", "free"], - "system.disk.io": ["read", "write"], - "system.disk.operations": ["read", "write"], - "system.disk.time": ["read", "write"], - "system.disk.merged": ["read", "write"], - "system.network.dropped.packets": ["transmit", "receive"], - "system.network.packets": ["transmit", "receive"], - "system.network.errors": ["transmit", "receive"], - "system.network.io": ["trasmit", "receive"], - "system.network.connections": ["family", "type"], - "runtime.memory": ["rss", "vms"], - "runtime.cpu.time": ["user", "system"], - } - -Usage ------ - -.. code:: python - - from opentelemetry import metrics - from opentelemetry.instrumentation.system_metrics import SystemMetrics - from opentelemetry.sdk.metrics import MeterProvider, - from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter - - metrics.set_meter_provider(MeterProvider()) - exporter = ConsoleMetricsExporter() - SystemMetrics(exporter) - - # metrics are collected asynchronously - input("...") - - # to configure custom metrics - configuration = { - "system.memory.usage": ["used", "free", "cached"], - "system.cpu.time": ["idle", "user", "system", "irq"], - "system.network.io": ["trasmit", "receive"], - "runtime.memory": ["rss", "vms"], - "runtime.cpu.time": ["user", "system"], - } - SystemMetrics(exporter, config=configuration) - -API ---- -""" - -import gc -import os -import typing -from platform import python_implementation - -import psutil - -from opentelemetry import metrics -from opentelemetry.sdk.metrics.export import MetricsExporter -from opentelemetry.sdk.metrics.export.controller import PushController -from opentelemetry.sdk.util import get_dict_as_key - - -class SystemMetrics: - # pylint: disable=too-many-statements - def __init__( - self, - exporter: MetricsExporter, - interval: int = 30, - labels: typing.Optional[typing.Dict[str, str]] = None, - config: typing.Optional[typing.Dict[str, typing.List[str]]] = None, - ): - self._labels = {} if labels is None else labels - self.accumulator = metrics.get_meter(__name__) - self.controller = PushController( - accumulator=self.accumulator, exporter=exporter, interval=interval - ) - self._python_implementation = python_implementation().lower() - if config is None: - self._config = { - "system.cpu.time": ["idle", "user", "system", "irq"], - "system.cpu.utilization": ["idle", "user", "system", "irq"], - "system.memory.usage": ["used", "free", "cached"], - "system.memory.utilization": ["used", "free", "cached"], - "system.swap.usage": ["used", "free"], - "system.swap.utilization": ["used", "free"], - # system.swap.page.faults: [], - # system.swap.page.operations: [], - "system.disk.io": ["read", "write"], - "system.disk.operations": ["read", "write"], - "system.disk.time": ["read", "write"], - "system.disk.merged": ["read", "write"], - # "system.filesystem.usage": [], - # "system.filesystem.utilization": [], - "system.network.dropped.packets": ["transmit", "receive"], - "system.network.packets": ["transmit", "receive"], - "system.network.errors": ["transmit", "receive"], - "system.network.io": ["trasmit", "receive"], - "system.network.connections": ["family", "type"], - "runtime.memory": ["rss", "vms"], - "runtime.cpu.time": ["user", "system"], - } - else: - self._config = config - - self._proc = psutil.Process(os.getpid()) - - self._system_cpu_time_labels = self._labels.copy() - self._system_cpu_utilization_labels = self._labels.copy() - - self._system_memory_usage_labels = self._labels.copy() - self._system_memory_utilization_labels = self._labels.copy() - - self._system_swap_usage_labels = self._labels.copy() - self._system_swap_utilization_labels = self._labels.copy() - # self._system_swap_page_faults = self._labels.copy() - # self._system_swap_page_operations = self._labels.copy() - - self._system_disk_io_labels = self._labels.copy() - self._system_disk_operations_labels = self._labels.copy() - self._system_disk_time_labels = self._labels.copy() - self._system_disk_merged_labels = self._labels.copy() - - # self._system_filesystem_usage_labels = self._labels.copy() - # self._system_filesystem_utilization_labels = self._labels.copy() - - self._system_network_dropped_packets_labels = self._labels.copy() - self._system_network_packets_labels = self._labels.copy() - self._system_network_errors_labels = self._labels.copy() - self._system_network_io_labels = self._labels.copy() - self._system_network_connections_labels = self._labels.copy() - - self._runtime_memory_labels = self._labels.copy() - self._runtime_cpu_time_labels = self._labels.copy() - self._runtime_gc_count_labels = self._labels.copy() - - self.accumulator.register_sumobserver( - callback=self._get_system_cpu_time, - name="system.cpu.time", - description="System CPU time", - unit="seconds", - value_type=float, - ) - - self.accumulator.register_valueobserver( - callback=self._get_system_cpu_utilization, - name="system.cpu.utilization", - description="System CPU utilization", - unit="1", - value_type=float, - ) - - self.accumulator.register_valueobserver( - callback=self._get_system_memory_usage, - name="system.memory.usage", - description="System memory usage", - unit="bytes", - value_type=int, - ) - - self.accumulator.register_valueobserver( - callback=self._get_system_memory_utilization, - name="system.memory.utilization", - description="System memory utilization", - unit="1", - value_type=float, - ) - - self.accumulator.register_valueobserver( - callback=self._get_system_swap_usage, - name="system.swap.usage", - description="System swap usage", - unit="pages", - value_type=int, - ) - - self.accumulator.register_valueobserver( - callback=self._get_system_swap_utilization, - name="system.swap.utilization", - description="System swap utilization", - unit="1", - value_type=float, - ) - - # self.accumulator.register_sumobserver( - # callback=self._get_system_swap_page_faults, - # name="system.swap.page_faults", - # description="System swap page faults", - # unit="faults", - # value_type=int, - # ) - - # self.accumulator.register_sumobserver( - # callback=self._get_system_swap_page_operations, - # name="system.swap.page_operations", - # description="System swap page operations", - # unit="operations", - # value_type=int, - # ) - - self.accumulator.register_sumobserver( - callback=self._get_system_disk_io, - name="system.disk.io", - description="System disk IO", - unit="bytes", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_system_disk_operations, - name="system.disk.operations", - description="System disk operations", - unit="operations", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_system_disk_time, - name="system.disk.time", - description="System disk time", - unit="seconds", - value_type=float, - ) - - self.accumulator.register_sumobserver( - callback=self._get_system_disk_merged, - name="system.disk.merged", - description="System disk merged", - unit="1", - value_type=int, - ) - - # self.accumulator.register_valueobserver( - # callback=self._get_system_filesystem_usage, - # name="system.filesystem.usage", - # description="System filesystem usage", - # unit="bytes", - # value_type=int, - # ) - - # self.accumulator.register_valueobserver( - # callback=self._get_system_filesystem_utilization, - # name="system.filesystem.utilization", - # description="System filesystem utilization", - # unit="1", - # value_type=float, - # ) - - self.accumulator.register_sumobserver( - callback=self._get_system_network_dropped_packets, - name="system.network.dropped_packets", - description="System network dropped_packets", - unit="packets", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_system_network_packets, - name="system.network.packets", - description="System network packets", - unit="packets", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_system_network_errors, - name="system.network.errors", - description="System network errors", - unit="errors", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_system_network_io, - name="system.network.io", - description="System network io", - unit="bytes", - value_type=int, - ) - - self.accumulator.register_updownsumobserver( - callback=self._get_system_network_connections, - name="system.network.connections", - description="System network connections", - unit="connections", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_runtime_memory, - name="runtime.{}.memory".format(self._python_implementation), - description="Runtime {} memory".format( - self._python_implementation - ), - unit="bytes", - value_type=int, - ) - - self.accumulator.register_sumobserver( - callback=self._get_runtime_cpu_time, - name="runtime.{}.cpu_time".format(self._python_implementation), - description="Runtime {} CPU time".format( - self._python_implementation - ), - unit="seconds", - value_type=float, - ) - - self.accumulator.register_sumobserver( - callback=self._get_runtime_gc_count, - name="runtime.{}.gc_count".format(self._python_implementation), - description="Runtime {} GC count".format( - self._python_implementation - ), - unit="bytes", - value_type=int, - ) - - def _get_system_cpu_time(self, observer: metrics.ValueObserver) -> None: - """Observer callback for system CPU time - - Args: - observer: the observer to update - """ - for cpu, times in enumerate(psutil.cpu_times(percpu=True)): - for metric in self._config["system.cpu.time"]: - if hasattr(times, metric): - self._system_cpu_time_labels["state"] = metric - self._system_cpu_time_labels["cpu"] = cpu + 1 - observer.observe( - getattr(times, metric), self._system_cpu_time_labels - ) - - def _get_system_cpu_utilization( - self, observer: metrics.ValueObserver - ) -> None: - """Observer callback for system CPU utilization - - Args: - observer: the observer to update - """ - - for cpu, times_percent in enumerate( - psutil.cpu_times_percent(percpu=True) - ): - for metric in self._config["system.cpu.utilization"]: - if hasattr(times_percent, metric): - self._system_cpu_utilization_labels["state"] = metric - self._system_cpu_utilization_labels["cpu"] = cpu + 1 - observer.observe( - getattr(times_percent, metric) / 100, - self._system_cpu_utilization_labels, - ) - - def _get_system_memory_usage( - self, observer: metrics.ValueObserver - ) -> None: - """Observer callback for memory usage - - Args: - observer: the observer to update - """ - virtual_memory = psutil.virtual_memory() - for metric in self._config["system.memory.usage"]: - self._system_memory_usage_labels["state"] = metric - if hasattr(virtual_memory, metric): - observer.observe( - getattr(virtual_memory, metric), - self._system_memory_usage_labels, - ) - - def _get_system_memory_utilization( - self, observer: metrics.ValueObserver - ) -> None: - """Observer callback for memory utilization - - Args: - observer: the observer to update - """ - system_memory = psutil.virtual_memory() - - for metric in self._config["system.memory.utilization"]: - self._system_memory_utilization_labels["state"] = metric - if hasattr(system_memory, metric): - observer.observe( - getattr(system_memory, metric) / system_memory.total, - self._system_memory_utilization_labels, - ) - - def _get_system_swap_usage(self, observer: metrics.ValueObserver) -> None: - """Observer callback for swap usage - - Args: - observer: the observer to update - """ - system_swap = psutil.swap_memory() - - for metric in self._config["system.swap.usage"]: - self._system_swap_usage_labels["state"] = metric - if hasattr(system_swap, metric): - observer.observe( - getattr(system_swap, metric), - self._system_swap_usage_labels, - ) - - def _get_system_swap_utilization( - self, observer: metrics.ValueObserver - ) -> None: - """Observer callback for swap utilization - - Args: - observer: the observer to update - """ - system_swap = psutil.swap_memory() - - for metric in self._config["system.swap.utilization"]: - if hasattr(system_swap, metric): - self._system_swap_utilization_labels["state"] = metric - observer.observe( - getattr(system_swap, metric) / system_swap.total, - self._system_swap_utilization_labels, - ) - - # TODO Add _get_system_swap_page_faults - # TODO Add _get_system_swap_page_operations - - def _get_system_disk_io(self, observer: metrics.SumObserver) -> None: - """Observer callback for disk IO - - Args: - observer: the observer to update - """ - for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.io"]: - if hasattr(counters, "{}_bytes".format(metric)): - self._system_disk_io_labels["device"] = device - self._system_disk_io_labels["direction"] = metric - observer.observe( - getattr(counters, "{}_bytes".format(metric)), - self._system_disk_io_labels, - ) - - def _get_system_disk_operations( - self, observer: metrics.SumObserver - ) -> None: - """Observer callback for disk operations - - Args: - observer: the observer to update - """ - for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.operations"]: - if hasattr(counters, "{}_count".format(metric)): - self._system_disk_operations_labels["device"] = device - self._system_disk_operations_labels["direction"] = metric - observer.observe( - getattr(counters, "{}_count".format(metric)), - self._system_disk_operations_labels, - ) - - def _get_system_disk_time(self, observer: metrics.SumObserver) -> None: - """Observer callback for disk time - - Args: - observer: the observer to update - """ - for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.time"]: - if hasattr(counters, "{}_time".format(metric)): - self._system_disk_time_labels["device"] = device - self._system_disk_time_labels["direction"] = metric - observer.observe( - getattr(counters, "{}_time".format(metric)) / 1000, - self._system_disk_time_labels, - ) - - def _get_system_disk_merged(self, observer: metrics.SumObserver) -> None: - """Observer callback for disk merged operations - - Args: - observer: the observer to update - """ - - # FIXME The units in the spec is 1, it seems like it should be - # operations or the value type should be Double - - for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.time"]: - if hasattr(counters, "{}_merged_count".format(metric)): - self._system_disk_merged_labels["device"] = device - self._system_disk_merged_labels["direction"] = metric - observer.observe( - getattr(counters, "{}_merged_count".format(metric)), - self._system_disk_merged_labels, - ) - - # TODO Add _get_system_filesystem_usage - # TODO Add _get_system_filesystem_utilization - # TODO Filesystem information can be obtained with os.statvfs in Unix-like - # OSs, how to do the same in Windows? - - def _get_system_network_dropped_packets( - self, observer: metrics.SumObserver - ) -> None: - """Observer callback for network dropped packets - - Args: - observer: the observer to update - """ - - for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.dropped.packets"]: - in_out = {"receive": "in", "transmit": "out"}[metric] - if hasattr(counters, "drop{}".format(in_out)): - self._system_network_dropped_packets_labels[ - "device" - ] = device - self._system_network_dropped_packets_labels[ - "direction" - ] = metric - observer.observe( - getattr(counters, "drop{}".format(in_out)), - self._system_network_dropped_packets_labels, - ) - - def _get_system_network_packets( - self, observer: metrics.SumObserver - ) -> None: - """Observer callback for network packets - - Args: - observer: the observer to update - """ - - for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.dropped.packets"]: - recv_sent = {"receive": "recv", "transmit": "sent"}[metric] - if hasattr(counters, "packets_{}".format(recv_sent)): - self._system_network_packets_labels["device"] = device - self._system_network_packets_labels["direction"] = metric - observer.observe( - getattr(counters, "packets_{}".format(recv_sent)), - self._system_network_packets_labels, - ) - - def _get_system_network_errors( - self, observer: metrics.SumObserver - ) -> None: - """Observer callback for network errors - - Args: - observer: the observer to update - """ - for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.errors"]: - in_out = {"receive": "in", "transmit": "out"}[metric] - if hasattr(counters, "err{}".format(in_out)): - self._system_network_errors_labels["device"] = device - self._system_network_errors_labels["direction"] = metric - observer.observe( - getattr(counters, "err{}".format(in_out)), - self._system_network_errors_labels, - ) - - def _get_system_network_io(self, observer: metrics.SumObserver) -> None: - """Observer callback for network IO - - Args: - observer: the observer to update - """ - - for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.dropped.packets"]: - recv_sent = {"receive": "recv", "transmit": "sent"}[metric] - if hasattr(counters, "bytes_{}".format(recv_sent)): - self._system_network_io_labels["device"] = device - self._system_network_io_labels["direction"] = metric - observer.observe( - getattr(counters, "bytes_{}".format(recv_sent)), - self._system_network_io_labels, - ) - - def _get_system_network_connections( - self, observer: metrics.UpDownSumObserver - ) -> None: - """Observer callback for network connections - - Args: - observer: the observer to update - """ - # TODO How to find the device identifier for a particular - # connection? - - connection_counters = {} - - for net_connection in psutil.net_connections(): - for metric in self._config["system.network.connections"]: - self._system_network_connections_labels["protocol"] = { - 1: "tcp", - 2: "udp", - }[net_connection.type.value] - self._system_network_connections_labels[ - "state" - ] = net_connection.status - self._system_network_connections_labels[metric] = getattr( - net_connection, metric - ) - - connection_counters_key = get_dict_as_key( - self._system_network_connections_labels - ) - - if connection_counters_key in connection_counters.keys(): - connection_counters[connection_counters_key]["counter"] += 1 - else: - connection_counters[connection_counters_key] = { - "counter": 1, - "labels": self._system_network_connections_labels.copy(), - } - - for connection_counter in connection_counters.values(): - observer.observe( - connection_counter["counter"], connection_counter["labels"], - ) - - def _get_runtime_memory(self, observer: metrics.SumObserver) -> None: - """Observer callback for runtime memory - - Args: - observer: the observer to update - """ - proc_memory = self._proc.memory_info() - for metric in self._config["runtime.memory"]: - if hasattr(proc_memory, metric): - self._runtime_memory_labels["type"] = metric - observer.observe( - getattr(proc_memory, metric), self._runtime_memory_labels, - ) - - def _get_runtime_cpu_time(self, observer: metrics.SumObserver) -> None: - """Observer callback for runtime CPU time - - Args: - observer: the observer to update - """ - proc_cpu = self._proc.cpu_times() - for metric in self._config["runtime.cpu.time"]: - if hasattr(proc_cpu, metric): - self._runtime_cpu_time_labels["type"] = metric - observer.observe( - getattr(proc_cpu, metric), self._runtime_cpu_time_labels, - ) - - def _get_runtime_gc_count(self, observer: metrics.SumObserver) -> None: - """Observer callback for garbage collection - - Args: - observer: the observer to update - """ - for index, count in enumerate(gc.get_count()): - self._runtime_gc_count_labels["count"] = str(index) - observer.observe(count, self._runtime_gc_count_labels) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py deleted file mode 100644 index ebb75f6c11..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/version.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -__version__ = "0.18.dev0" diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py deleted file mode 100644 index bf2c2d4478..0000000000 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ /dev/null @@ -1,703 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# pylint: disable=protected-access - -from collections import namedtuple -from platform import python_implementation -from unittest import mock - -from opentelemetry import metrics -from opentelemetry.instrumentation.system_metrics import SystemMetrics -from opentelemetry.sdk.metrics.export.aggregate import ValueObserverAggregator -from opentelemetry.test.test_base import TestBase - - -class TestSystemMetrics(TestBase): - def setUp(self): - super().setUp() - self.memory_metrics_exporter.clear() - self.implementation = python_implementation().lower() - - def test_system_metrics_constructor(self): - # ensure the observers have been registered - meter = metrics.get_meter(__name__) - with mock.patch("opentelemetry.metrics.get_meter") as mock_get_meter: - mock_get_meter.return_value = meter - SystemMetrics(self.memory_metrics_exporter) - - self.assertEqual(len(meter.instruments), 18) - - observer_names = [ - "system.cpu.time", - "system.cpu.utilization", - "system.memory.usage", - "system.memory.utilization", - "system.swap.usage", - "system.swap.utilization", - "system.disk.io", - "system.disk.operations", - "system.disk.time", - "system.disk.merged", - "system.network.dropped_packets", - "system.network.packets", - "system.network.errors", - "system.network.io", - "system.network.connections", - "runtime.{}.memory".format(self.implementation), - "runtime.{}.cpu_time".format(self.implementation), - "runtime.{}.gc_count".format(self.implementation), - ] - - for observer in meter.instruments.values(): - self.assertIn(observer.name, observer_names) - observer_names.remove(observer.name) - - def _assert_metrics(self, observer_name, system_metrics, expected): - system_metrics.controller.tick() - assertions = 0 - for ( - metric - ) in ( - self.memory_metrics_exporter._exported_metrics # pylint: disable=protected-access - ): - if ( - metric.labels in expected - and metric.instrument.name == observer_name - ): - self.assertEqual( - metric.aggregator.checkpoint, expected[metric.labels], - ) - assertions += 1 - self.assertEqual(len(expected), assertions) - - def _test_metrics(self, observer_name, expected): - meter = self.meter_provider.get_meter(__name__) - - with mock.patch("opentelemetry.metrics.get_meter") as mock_get_meter: - mock_get_meter.return_value = meter - system_metrics = SystemMetrics(self.memory_metrics_exporter) - self._assert_metrics(observer_name, system_metrics, expected) - - # When this test case is executed, _get_system_cpu_utilization gets run - # too because of the controller thread which runs all observers. This patch - # is added here to stop a warning that would otherwise be raised. - # pylint: disable=unused-argument - @mock.patch("psutil.cpu_times_percent") - @mock.patch("psutil.cpu_times") - def test_system_cpu_time(self, mock_cpu_times, mock_cpu_times_percent): - CPUTimes = namedtuple("CPUTimes", ["idle", "user", "system", "irq"]) - mock_cpu_times.return_value = [ - CPUTimes(idle=1.2, user=3.4, system=5.6, irq=7.8), - CPUTimes(idle=1.2, user=3.4, system=5.6, irq=7.8), - ] - - expected = { - (("cpu", 1), ("state", "idle"),): 1.2, - (("cpu", 1), ("state", "user"),): 3.4, - (("cpu", 1), ("state", "system"),): 5.6, - (("cpu", 1), ("state", "irq"),): 7.8, - (("cpu", 2), ("state", "idle"),): 1.2, - (("cpu", 2), ("state", "user"),): 3.4, - (("cpu", 2), ("state", "system"),): 5.6, - (("cpu", 2), ("state", "irq"),): 7.8, - } - self._test_metrics("system.cpu.time", expected) - - @mock.patch("psutil.cpu_times_percent") - def test_system_cpu_utilization(self, mock_cpu_times_percent): - CPUTimesPercent = namedtuple( - "CPUTimesPercent", ["idle", "user", "system", "irq"] - ) - mock_cpu_times_percent.return_value = [ - CPUTimesPercent(idle=1.2, user=3.4, system=5.6, irq=7.8), - CPUTimesPercent(idle=1.2, user=3.4, system=5.6, irq=7.8), - ] - - expected = { - (("cpu", 1), ("state", "idle"),): ValueObserverAggregator._TYPE( - min=1.2 / 100, - max=1.2 / 100, - sum=1.2 / 100, - count=1, - last=1.2 / 100, - ), - (("cpu", 1), ("state", "user"),): ValueObserverAggregator._TYPE( - min=3.4 / 100, - max=3.4 / 100, - sum=3.4 / 100, - count=1, - last=3.4 / 100, - ), - (("cpu", 1), ("state", "system"),): ValueObserverAggregator._TYPE( - min=5.6 / 100, - max=5.6 / 100, - sum=5.6 / 100, - count=1, - last=5.6 / 100, - ), - (("cpu", 1), ("state", "irq"),): ValueObserverAggregator._TYPE( - min=7.8 / 100, - max=7.8 / 100, - sum=7.8 / 100, - count=1, - last=7.8 / 100, - ), - (("cpu", 2), ("state", "idle"),): ValueObserverAggregator._TYPE( - min=1.2 / 100, - max=1.2 / 100, - sum=1.2 / 100, - count=1, - last=1.2 / 100, - ), - (("cpu", 2), ("state", "user"),): ValueObserverAggregator._TYPE( - min=3.4 / 100, - max=3.4 / 100, - sum=3.4 / 100, - count=1, - last=3.4 / 100, - ), - (("cpu", 2), ("state", "system"),): ValueObserverAggregator._TYPE( - min=5.6 / 100, - max=5.6 / 100, - sum=5.6 / 100, - count=1, - last=5.6 / 100, - ), - (("cpu", 2), ("state", "irq"),): ValueObserverAggregator._TYPE( - min=7.8 / 100, - max=7.8 / 100, - sum=7.8 / 100, - count=1, - last=7.8 / 100, - ), - } - self._test_metrics("system.cpu.utilization", expected) - - @mock.patch("psutil.virtual_memory") - def test_system_memory_usage(self, mock_virtual_memory): - VirtualMemory = namedtuple( - "VirtualMemory", ["used", "free", "cached", "total"] - ) - mock_virtual_memory.return_value = VirtualMemory( - used=1, free=2, cached=3, total=4 - ) - - expected = { - (("state", "used"),): ValueObserverAggregator._TYPE( - min=1, max=1, sum=1, count=1, last=1 - ), - (("state", "free"),): ValueObserverAggregator._TYPE( - min=2, max=2, sum=2, count=1, last=2 - ), - (("state", "cached"),): ValueObserverAggregator._TYPE( - min=3, max=3, sum=3, count=1, last=3 - ), - } - self._test_metrics("system.memory.usage", expected) - - @mock.patch("psutil.virtual_memory") - def test_system_memory_utilization(self, mock_virtual_memory): - VirtualMemory = namedtuple( - "VirtualMemory", ["used", "free", "cached", "total"] - ) - mock_virtual_memory.return_value = VirtualMemory( - used=1, free=2, cached=3, total=4 - ) - - expected = { - (("state", "used"),): ValueObserverAggregator._TYPE( - min=1 / 4, max=1 / 4, sum=1 / 4, count=1, last=1 / 4 - ), - (("state", "free"),): ValueObserverAggregator._TYPE( - min=2 / 4, max=2 / 4, sum=2 / 4, count=1, last=2 / 4 - ), - (("state", "cached"),): ValueObserverAggregator._TYPE( - min=3 / 4, max=3 / 4, sum=3 / 4, count=1, last=3 / 4 - ), - } - self._test_metrics("system.memory.utilization", expected) - - @mock.patch("psutil.swap_memory") - def test_system_swap_usage(self, mock_swap_memory): - SwapMemory = namedtuple("SwapMemory", ["used", "free", "total"]) - mock_swap_memory.return_value = SwapMemory(used=1, free=2, total=3) - - expected = { - (("state", "used"),): ValueObserverAggregator._TYPE( - min=1, max=1, sum=1, count=1, last=1 - ), - (("state", "free"),): ValueObserverAggregator._TYPE( - min=2, max=2, sum=2, count=1, last=2 - ), - } - self._test_metrics("system.swap.usage", expected) - - @mock.patch("psutil.swap_memory") - def test_system_swap_utilization(self, mock_swap_memory): - SwapMemory = namedtuple("SwapMemory", ["used", "free", "total"]) - mock_swap_memory.return_value = SwapMemory(used=1, free=2, total=3) - - expected = { - (("state", "used"),): ValueObserverAggregator._TYPE( - min=1 / 3, max=1 / 3, sum=1 / 3, count=1, last=1 / 3 - ), - (("state", "free"),): ValueObserverAggregator._TYPE( - min=2 / 3, max=2 / 3, sum=2 / 3, count=1, last=2 / 3 - ), - } - self._test_metrics("system.swap.utilization", expected) - - @mock.patch("psutil.disk_io_counters") - def test_system_disk_io(self, mock_disk_io_counters): - DiskIO = namedtuple( - "DiskIO", - [ - "read_count", - "write_count", - "read_bytes", - "write_bytes", - "read_time", - "write_time", - "read_merged_count", - "write_merged_count", - ], - ) - mock_disk_io_counters.return_value = { - "sda": DiskIO( - read_count=1, - write_count=2, - read_bytes=3, - write_bytes=4, - read_time=5, - write_time=6, - read_merged_count=7, - write_merged_count=8, - ), - "sdb": DiskIO( - read_count=9, - write_count=10, - read_bytes=11, - write_bytes=12, - read_time=13, - write_time=14, - read_merged_count=15, - write_merged_count=16, - ), - } - - expected = { - (("device", "sda"), ("direction", "read"),): 3, - (("device", "sda"), ("direction", "write"),): 4, - (("device", "sdb"), ("direction", "read"),): 11, - (("device", "sdb"), ("direction", "write"),): 12, - } - self._test_metrics("system.disk.io", expected) - - @mock.patch("psutil.disk_io_counters") - def test_system_disk_operations(self, mock_disk_io_counters): - DiskIO = namedtuple( - "DiskIO", - [ - "read_count", - "write_count", - "read_bytes", - "write_bytes", - "read_time", - "write_time", - "read_merged_count", - "write_merged_count", - ], - ) - mock_disk_io_counters.return_value = { - "sda": DiskIO( - read_count=1, - write_count=2, - read_bytes=3, - write_bytes=4, - read_time=5, - write_time=6, - read_merged_count=7, - write_merged_count=8, - ), - "sdb": DiskIO( - read_count=9, - write_count=10, - read_bytes=11, - write_bytes=12, - read_time=13, - write_time=14, - read_merged_count=15, - write_merged_count=16, - ), - } - - expected = { - (("device", "sda"), ("direction", "read"),): 1, - (("device", "sda"), ("direction", "write"),): 2, - (("device", "sdb"), ("direction", "read"),): 9, - (("device", "sdb"), ("direction", "write"),): 10, - } - self._test_metrics("system.disk.operations", expected) - - @mock.patch("psutil.disk_io_counters") - def test_system_disk_time(self, mock_disk_io_counters): - DiskIO = namedtuple( - "DiskIO", - [ - "read_count", - "write_count", - "read_bytes", - "write_bytes", - "read_time", - "write_time", - "read_merged_count", - "write_merged_count", - ], - ) - mock_disk_io_counters.return_value = { - "sda": DiskIO( - read_count=1, - write_count=2, - read_bytes=3, - write_bytes=4, - read_time=5, - write_time=6, - read_merged_count=7, - write_merged_count=8, - ), - "sdb": DiskIO( - read_count=9, - write_count=10, - read_bytes=11, - write_bytes=12, - read_time=13, - write_time=14, - read_merged_count=15, - write_merged_count=16, - ), - } - - expected = { - (("device", "sda"), ("direction", "read"),): 5 / 1000, - (("device", "sda"), ("direction", "write"),): 6 / 1000, - (("device", "sdb"), ("direction", "read"),): 13 / 1000, - (("device", "sdb"), ("direction", "write"),): 14 / 1000, - } - self._test_metrics("system.disk.time", expected) - - @mock.patch("psutil.disk_io_counters") - def test_system_disk_merged(self, mock_disk_io_counters): - DiskIO = namedtuple( - "DiskIO", - [ - "read_count", - "write_count", - "read_bytes", - "write_bytes", - "read_time", - "write_time", - "read_merged_count", - "write_merged_count", - ], - ) - mock_disk_io_counters.return_value = { - "sda": DiskIO( - read_count=1, - write_count=2, - read_bytes=3, - write_bytes=4, - read_time=5, - write_time=6, - read_merged_count=7, - write_merged_count=8, - ), - "sdb": DiskIO( - read_count=9, - write_count=10, - read_bytes=11, - write_bytes=12, - read_time=13, - write_time=14, - read_merged_count=15, - write_merged_count=16, - ), - } - - expected = { - (("device", "sda"), ("direction", "read"),): 7, - (("device", "sda"), ("direction", "write"),): 8, - (("device", "sdb"), ("direction", "read"),): 15, - (("device", "sdb"), ("direction", "write"),): 16, - } - self._test_metrics("system.disk.merged", expected) - - @mock.patch("psutil.net_io_counters") - def test_system_network_dropped_packets(self, mock_net_io_counters): - NetIO = namedtuple( - "NetIO", - [ - "dropin", - "dropout", - "packets_sent", - "packets_recv", - "errin", - "errout", - "bytes_sent", - "bytes_recv", - ], - ) - mock_net_io_counters.return_value = { - "eth0": NetIO( - dropin=1, - dropout=2, - packets_sent=3, - packets_recv=4, - errin=5, - errout=6, - bytes_sent=7, - bytes_recv=8, - ), - "eth1": NetIO( - dropin=9, - dropout=10, - packets_sent=11, - packets_recv=12, - errin=13, - errout=14, - bytes_sent=15, - bytes_recv=16, - ), - } - - expected = { - (("device", "eth0"), ("direction", "receive"),): 1, - (("device", "eth0"), ("direction", "transmit"),): 2, - (("device", "eth1"), ("direction", "receive"),): 9, - (("device", "eth1"), ("direction", "transmit"),): 10, - } - self._test_metrics("system.network.dropped_packets", expected) - - @mock.patch("psutil.net_io_counters") - def test_system_network_packets(self, mock_net_io_counters): - NetIO = namedtuple( - "NetIO", - [ - "dropin", - "dropout", - "packets_sent", - "packets_recv", - "errin", - "errout", - "bytes_sent", - "bytes_recv", - ], - ) - mock_net_io_counters.return_value = { - "eth0": NetIO( - dropin=1, - dropout=2, - packets_sent=3, - packets_recv=4, - errin=5, - errout=6, - bytes_sent=7, - bytes_recv=8, - ), - "eth1": NetIO( - dropin=9, - dropout=10, - packets_sent=11, - packets_recv=12, - errin=13, - errout=14, - bytes_sent=15, - bytes_recv=16, - ), - } - - expected = { - (("device", "eth0"), ("direction", "receive"),): 4, - (("device", "eth0"), ("direction", "transmit"),): 3, - (("device", "eth1"), ("direction", "receive"),): 12, - (("device", "eth1"), ("direction", "transmit"),): 11, - } - self._test_metrics("system.network.packets", expected) - - @mock.patch("psutil.net_io_counters") - def test_system_network_errors(self, mock_net_io_counters): - NetIO = namedtuple( - "NetIO", - [ - "dropin", - "dropout", - "packets_sent", - "packets_recv", - "errin", - "errout", - "bytes_sent", - "bytes_recv", - ], - ) - mock_net_io_counters.return_value = { - "eth0": NetIO( - dropin=1, - dropout=2, - packets_sent=3, - packets_recv=4, - errin=5, - errout=6, - bytes_sent=7, - bytes_recv=8, - ), - "eth1": NetIO( - dropin=9, - dropout=10, - packets_sent=11, - packets_recv=12, - errin=13, - errout=14, - bytes_sent=15, - bytes_recv=16, - ), - } - - expected = { - (("device", "eth0"), ("direction", "receive"),): 5, - (("device", "eth0"), ("direction", "transmit"),): 6, - (("device", "eth1"), ("direction", "receive"),): 13, - (("device", "eth1"), ("direction", "transmit"),): 14, - } - self._test_metrics("system.network.errors", expected) - - @mock.patch("psutil.net_io_counters") - def test_system_network_io(self, mock_net_io_counters): - NetIO = namedtuple( - "NetIO", - [ - "dropin", - "dropout", - "packets_sent", - "packets_recv", - "errin", - "errout", - "bytes_sent", - "bytes_recv", - ], - ) - mock_net_io_counters.return_value = { - "eth0": NetIO( - dropin=1, - dropout=2, - packets_sent=3, - packets_recv=4, - errin=5, - errout=6, - bytes_sent=7, - bytes_recv=8, - ), - "eth1": NetIO( - dropin=9, - dropout=10, - packets_sent=11, - packets_recv=12, - errin=13, - errout=14, - bytes_sent=15, - bytes_recv=16, - ), - } - - expected = { - (("device", "eth0"), ("direction", "receive"),): 8, - (("device", "eth0"), ("direction", "transmit"),): 7, - (("device", "eth1"), ("direction", "receive"),): 16, - (("device", "eth1"), ("direction", "transmit"),): 15, - } - self._test_metrics("system.network.io", expected) - - @mock.patch("psutil.net_connections") - def test_system_network_connections(self, mock_net_connections): - NetConnection = namedtuple( - "NetworkConnection", ["family", "type", "status"] - ) - Type = namedtuple("Type", ["value"]) - mock_net_connections.return_value = [ - NetConnection(family=1, status="ESTABLISHED", type=Type(value=2),), - NetConnection(family=1, status="ESTABLISHED", type=Type(value=1),), - ] - - expected = { - ( - ("family", 1), - ("protocol", "udp"), - ("state", "ESTABLISHED"), - ("type", Type(value=2)), - ): 1, - ( - ("family", 1), - ("protocol", "tcp"), - ("state", "ESTABLISHED"), - ("type", Type(value=1)), - ): 1, - } - self._test_metrics("system.network.connections", expected) - - @mock.patch("psutil.Process.memory_info") - def test_runtime_memory(self, mock_process_memory_info): - - PMem = namedtuple("PMem", ["rss", "vms"]) - - mock_process_memory_info.configure_mock( - **{"return_value": PMem(rss=1, vms=2)} - ) - - expected = { - (("type", "rss"),): 1, - (("type", "vms"),): 2, - } - self._test_metrics( - "runtime.{}.memory".format(self.implementation), expected - ) - - @mock.patch("psutil.Process.cpu_times") - def test_runtime_cpu_time(self, mock_process_cpu_times): - - PCPUTimes = namedtuple("PCPUTimes", ["user", "system"]) - - mock_process_cpu_times.configure_mock( - **{"return_value": PCPUTimes(user=1.1, system=2.2)} - ) - - expected = { - (("type", "user"),): 1.1, - (("type", "system"),): 2.2, - } - self._test_metrics( - "runtime.{}.cpu_time".format(self.implementation), expected - ) - - @mock.patch("gc.get_count") - def test_runtime_get_count(self, mock_gc_get_count): - - mock_gc_get_count.configure_mock(**{"return_value": (1, 2, 3)}) - - expected = { - (("count", "0"),): 1, - (("count", "1"),): 2, - (("count", "2"),): 3, - } - self._test_metrics( - "runtime.{}.gc_count".format(self.implementation), expected - ) diff --git a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py index dddf2a00a0..cf3bbc7f52 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py @@ -45,11 +45,6 @@ from opentelemetry import context, propagators from opentelemetry.instrumentation.instrumentor import BaseInstrumentor -from opentelemetry.instrumentation.metric import ( - HTTPMetricRecorder, - HTTPMetricType, - MetricMixin, -) from opentelemetry.instrumentation.urllib.version import ( # pylint: disable=no-name-in-module,import-error __version__, ) @@ -61,7 +56,7 @@ _SUPPRESS_URLLIB_INSTRUMENTATION_KEY = "suppress_urllib_instrumentation" -class URLLibInstrumentor(BaseInstrumentor, MetricMixin): +class URLLibInstrumentor(BaseInstrumentor): """An instrumentor for urllib See `BaseInstrumentor` """ @@ -85,15 +80,6 @@ def _instrument(self, **kwargs): name_callback=kwargs.get("name_callback"), ) - self.init_metrics( - __name__, __version__, - ) - - # pylint: disable=W0201 - self.metric_recorder = HTTPMetricRecorder( - self.meter, HTTPMetricType.CLIENT - ) - def _uninstrument(self, **kwargs): _uninstrument() @@ -150,8 +136,6 @@ def _instrumented_open_call( if not span_name or not isinstance(span_name, str): span_name = get_default_span_name(method) - recorder = URLLibInstrumentor().metric_recorder - labels = { "http.method": method, "http.url": url, @@ -161,47 +145,40 @@ def _instrumented_open_call( __name__, __version__, tracer_provider ).start_as_current_span(span_name, kind=SpanKind.CLIENT) as span: exception = None - with recorder.record_client_duration(labels): + if span.is_recording(): + span.set_attribute("http.method", method) + span.set_attribute("http.url", url) + + headers = get_or_create_headers() + propagators.inject(type(headers).__setitem__, headers) + + token = context.attach( + context.set_value(_SUPPRESS_URLLIB_INSTRUMENTATION_KEY, True) + ) + try: + result = call_wrapped() # *** PROCEED + except Exception as exc: # pylint: disable=W0703 + exception = exc + result = getattr(exc, "file", None) + finally: + context.detach(token) + + if result is not None: + + code_ = result.getcode() + labels["http.status_code"] = str(code_) + if span.is_recording(): - span.set_attribute("http.method", method) - span.set_attribute("http.url", url) - - headers = get_or_create_headers() - propagators.inject(type(headers).__setitem__, headers) - - token = context.attach( - context.set_value( - _SUPPRESS_URLLIB_INSTRUMENTATION_KEY, True - ) - ) - try: - result = call_wrapped() # *** PROCEED - except Exception as exc: # pylint: disable=W0703 - exception = exc - result = getattr(exc, "file", None) - finally: - context.detach(token) - - if result is not None: - - code_ = result.getcode() - labels["http.status_code"] = str(code_) - - if span.is_recording(): - span.set_attribute("http.status_code", code_) - span.set_attribute("http.status_text", result.reason) - span.set_status( - Status(http_status_to_status_code(code_)) - ) - - ver_ = str(getattr(result, "version", "")) - if ver_: - labels["http.flavor"] = "{}.{}".format( - ver_[:1], ver_[:-1] - ) - - if span_callback is not None: - span_callback(span, result) + span.set_attribute("http.status_code", code_) + span.set_attribute("http.status_text", result.reason) + span.set_status(Status(http_status_to_status_code(code_))) + + ver_ = str(getattr(result, "version", "")) + if ver_: + labels["http.flavor"] = "{}.{}".format(ver_[:1], ver_[:-1]) + + if span_callback is not None: + span_callback(span, result) if exception is not None: raise exception.with_traceback(exception.__traceback__) diff --git a/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py b/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py index d6af3acee8..da01f97b73 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py +++ b/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py @@ -29,7 +29,6 @@ URLLibInstrumentor, ) from opentelemetry.sdk import resources -from opentelemetry.sdk.util import get_dict_as_key from opentelemetry.test.mock_textmap import MockTextMapPropagator from opentelemetry.test.test_base import TestBase from opentelemetry.trace.status import StatusCode @@ -117,26 +116,6 @@ def test_basic(self): span, opentelemetry.instrumentation.urllib ) - self.assertIsNotNone(URLLibInstrumentor().meter) - self.assertEqual(len(URLLibInstrumentor().meter.instruments), 1) - recorder = list(URLLibInstrumentor().meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.flavor": "1.1", - "http.method": "GET", - "http.status_code": "200", - "http.url": "http://httpbin.org/status/200", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) - self.assertGreaterEqual(view_data.aggregator.current.sum, 0) - def test_name_callback(self): def name_callback(method, url): return "GET" + url @@ -325,24 +304,6 @@ def test_requests_exception_with_response(self, *_, **__): }, ) self.assertEqual(span.status.status_code, StatusCode.ERROR) - self.assertIsNotNone(URLLibInstrumentor().meter) - self.assertEqual(len(URLLibInstrumentor().meter.instruments), 1) - recorder = list(URLLibInstrumentor().meter.instruments.values())[0] - match_key = get_dict_as_key( - { - "http.method": "GET", - "http.status_code": "500", - "http.url": "http://httpbin.org/status/500", - "http.flavor": "1.1", - } - ) - for key in recorder.bound_instruments.keys(): - self.assertEqual(key, match_key) - # pylint: disable=protected-access - bound = recorder.bound_instruments.get(key) - for view_data in bound.view_datas: - self.assertEqual(view_data.labels, key) - self.assertEqual(view_data.aggregator.current.count, 1) def test_requests_basic_exception(self, *_, **__): with self.assertRaises(Exception): diff --git a/pyproject.toml b/pyproject.toml index 5dbe095fe8..51dfc82da5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,6 @@ exclude = ''' ( /( reference| # original files from DataDog - exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/gen )/ ) ''' diff --git a/tests/opentelemetry-docker-tests/tests/docker-compose.yml b/tests/opentelemetry-docker-tests/tests/docker-compose.yml index 0f6e465521..7262bcc9cf 100644 --- a/tests/opentelemetry-docker-tests/tests/docker-compose.yml +++ b/tests/opentelemetry-docker-tests/tests/docker-compose.yml @@ -39,11 +39,3 @@ services: - "16686:16686" - "14268:14268" - "9411:9411" - cortex: - image: quay.io/cortexproject/cortex:v1.5.0 - command: - - -config.file=./config/cortex-config.yml - volumes: - - ./prometheus-remote-write-cortex/cortex-config.yml:/config/cortex-config.yml:ro - ports: - - 9009:9009 diff --git a/tests/opentelemetry-docker-tests/tests/prometheus-remote-write-cortex/cortex-config.yml b/tests/opentelemetry-docker-tests/tests/prometheus-remote-write-cortex/cortex-config.yml deleted file mode 100644 index 37bd6473d6..0000000000 --- a/tests/opentelemetry-docker-tests/tests/prometheus-remote-write-cortex/cortex-config.yml +++ /dev/null @@ -1,100 +0,0 @@ -# This Cortex Config is copied from the Cortex Project documentation -# Source: https://github.com/cortexproject/cortex/blob/master/docs/configuration/single-process-config.yaml - -# Configuration for running Cortex in single-process mode. -# This configuration should not be used in production. -# It is only for getting started and development. - -# Disable the requirement that every request to Cortex has a -# X-Scope-OrgID header. `fake` will be substituted in instead. -auth_enabled: false - -server: - http_listen_port: 9009 - - # Configure the server to allow messages up to 100MB. - grpc_server_max_recv_msg_size: 104857600 - grpc_server_max_send_msg_size: 104857600 - grpc_server_max_concurrent_streams: 1000 - -distributor: - shard_by_all_labels: true - pool: - health_check_ingesters: true - -ingester_client: - grpc_client_config: - # Configure the client to allow messages up to 100MB. - max_recv_msg_size: 104857600 - max_send_msg_size: 104857600 - use_gzip_compression: true - -ingester: - # We want our ingesters to flush chunks at the same time to optimise - # deduplication opportunities. - spread_flushes: true - chunk_age_jitter: 0 - - walconfig: - wal_enabled: true - recover_from_wal: true - wal_dir: /tmp/cortex/wal - - lifecycler: - # The address to advertise for this ingester. Will be autodiscovered by - # looking up address on eth0 or en0; can be specified if this fails. - # address: 127.0.0.1 - - # We want to start immediately and flush on shutdown. - join_after: 0 - min_ready_duration: 0s - final_sleep: 0s - num_tokens: 512 - tokens_file_path: /tmp/cortex/wal/tokens - - # Use an in memory ring store, so we don't need to launch a Consul. - ring: - kvstore: - store: inmemory - replication_factor: 1 - -# Use local storage - BoltDB for the index, and the filesystem -# for the chunks. -schema: - configs: - - from: 2019-07-29 - store: boltdb - object_store: filesystem - schema: v10 - index: - prefix: index_ - period: 1w - -storage: - boltdb: - directory: /tmp/cortex/index - - filesystem: - directory: /tmp/cortex/chunks - - delete_store: - store: boltdb - -purger: - object_store_type: filesystem - -frontend_worker: - # Configure the frontend worker in the querier to match worker count - # to max_concurrent on the queriers. - match_max_concurrent: true - -# Configure the ruler to scan the /tmp/cortex/rules directory for prometheus -# rules: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#recording-rules -ruler: - enable_api: true - enable_sharding: false - storage: - type: local - local: - directory: /tmp/cortex/rules - diff --git a/tests/opentelemetry-docker-tests/tests/prometheus-remote-write-cortex/prometheus_remote_write_cortex_test.py b/tests/opentelemetry-docker-tests/tests/prometheus-remote-write-cortex/prometheus_remote_write_cortex_test.py deleted file mode 100644 index c2c6cdb0c2..0000000000 --- a/tests/opentelemetry-docker-tests/tests/prometheus-remote-write-cortex/prometheus_remote_write_cortex_test.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from opentelemetry import metrics -from opentelemetry.exporter.prometheus_remote_write import ( - PrometheusRemoteWriteMetricsExporter, -) -from opentelemetry.test.test_base import TestBase - - -def observer_callback(observer): - array = [1.0, 15.0, 25.0, 26.0] - for (index, usage) in enumerate(array): - labels = {"test_label": str(index)} - observer.observe(usage, labels) - - -class TestPrometheusRemoteWriteExporterCortex(TestBase): - def setUp(self): - super().setUp - self.exporter = PrometheusRemoteWriteMetricsExporter( - endpoint="http://localhost:9009/api/prom/push", - headers={"X-Scope-Org-ID": "5"}, - ) - self.labels = {"environment": "testing"} - self.meter = self.meter_provider.get_meter(__name__) - metrics.get_meter_provider().start_pipeline( - self.meter, self.exporter, 1, - ) - - def test_export_counter(self): - try: - requests_counter = self.meter.create_counter( - name="counter", - description="test_export_counter", - unit="1", - value_type=int, - ) - requests_counter.add(25, self.labels) - except Exception as e: - self.fail( - "Export counter failed with unexpected error {}".format(e) - ) - - def test_export_valuerecorder(self): - try: - requests_size = self.meter.create_valuerecorder( - name="valuerecorder", - description="test_export_valuerecorder", - unit="1", - value_type=int, - ) - requests_size.record(25, self.labels) - except Exception as e: - self.fail( - "Export valuerecorder failed with unexpected error {}".format( - e - ) - ) - - def test_export_updowncounter(self): - try: - requests_size = self.meter.create_updowncounter( - name="updowncounter", - description="test_export_updowncounter", - unit="1", - value_type=int, - ) - requests_size.add(-25, self.labels) - except Exception as e: - self.fail( - "Export updowncounter failed with unexpected error {}".format( - e - ) - ) - - def test_export_sumobserver(self): - try: - self.meter.register_sumobserver( - callback=observer_callback, - name="sumobserver", - description="test_export_sumobserver", - unit="1", - value_type=float, - ) - except Exception as e: - self.fail( - "Export sumobserver failed with unexpected error {}".format(e) - ) - - def test_export_updownsumobserver(self): - try: - self.meter.register_updownsumobserver( - callback=observer_callback, - name="updownsumobserver", - description="test_export_updownsumobserver", - unit="1", - value_type=float, - ) - except Exception as e: - self.fail( - "Export updownsumobserver failed with unexpected error {}".format( - e - ) - ) diff --git a/tox.ini b/tox.ini index 8016924dcc..6a2e9c4b44 100644 --- a/tox.ini +++ b/tox.ini @@ -128,11 +128,6 @@ envlist = ; opentelemetry-instrumentation-sklearn py3{5,6,7,8}-test-instrumentation-sklearn - ; opentelemetry-instrumentation-system-metrics - py3{5,6,7,8}-test-instrumentation-system-metrics - ; instrumentation-system-metrics intentionally excluded from pypy3 - ; known limitation: gc.get_count won't work under pypy - ; opentelemetry-instrumentation-tornado ; instrumentation supports >=6 on Py 3.5 and above. py3{5,6,7,8}-test-instrumentation-tornado @@ -194,7 +189,6 @@ changedir = test-instrumentation-sqlalchemy: instrumentation/opentelemetry-instrumentation-sqlalchemy/tests test-instrumentation-sqlite3: instrumentation/opentelemetry-instrumentation-sqlite3/tests test-instrumentation-starlette: instrumentation/opentelemetry-instrumentation-starlette/tests - test-instrumentation-system-metrics: instrumentation/opentelemetry-instrumentation-system-metrics/tests test-instrumentation-tornado: instrumentation/opentelemetry-instrumentation-tornado/tests test-instrumentation-wsgi: instrumentation/opentelemetry-instrumentation-wsgi/tests test-util-http: util/opentelemetry-util-http/tests @@ -273,11 +267,8 @@ commands_pre = sqlalchemy: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy - system-metrics: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-system-metrics[test] - elasticsearch{2,5,6,7}: pip install {toxinidir}/opentelemetry-python-core/opentelemetry-instrumentation {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch[test] - aws: pip install requests {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws http: pip install {toxinidir}/util/opentelemetry-util-http @@ -346,7 +337,6 @@ commands_pre = python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pymemcache[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-psycopg2[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiohttp-client[test] - python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-system-metrics[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlite3[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-pyramid[test] @@ -357,7 +347,6 @@ commands_pre = python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-asyncpg[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-tornado[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-mysql[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-prometheus-remote-write[test] python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-datadog[test] python -m pip install -e {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws[test] @@ -384,7 +373,6 @@ changedir = tests/opentelemetry-docker-tests/tests commands_pre = - sudo apt-get install libsnappy-dev pip install -e {toxinidir}/opentelemetry-python-core/opentelemetry-api \ -e {toxinidir}/opentelemetry-python-core/opentelemetry-instrumentation \ -e {toxinidir}/opentelemetry-python-core/opentelemetry-sdk \ @@ -399,9 +387,7 @@ commands_pre = -e {toxinidir}/instrumentation/opentelemetry-instrumentation-sqlalchemy \ -e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg \ -e {toxinidir}/instrumentation/opentelemetry-instrumentation-redis \ - -e {toxinidir}/instrumentation/opentelemetry-instrumentation-system-metrics \ - -e {toxinidir}/opentelemetry-python-core/exporter/opentelemetry-exporter-opencensus \ - -e {toxinidir}/exporter/opentelemetry-exporter-prometheus-remote-write + -e {toxinidir}/opentelemetry-python-core/exporter/opentelemetry-exporter-opencensus docker-compose up -d python check_availability.py commands =