Hello community,
here is the log from the commit of package python-prometheus_client for
openSUSE:Factory checked in at 2020-11-21 12:43:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-prometheus_client (Old)
and /work/SRC/openSUSE:Factory/.python-prometheus_client.new.5913 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-prometheus_client"
Sat Nov 21 12:43:09 2020 rev:11 rq:849681 version:0.9.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-prometheus_client/python-prometheus_client.changes
2020-05-29 21:36:13.542444237 +0200
+++
/work/SRC/openSUSE:Factory/.python-prometheus_client.new.5913/python-prometheus_client.changes
2020-11-23 10:45:25.374298532 +0100
@@ -1,0 +2,7 @@
+Fri Nov 20 12:56:42 UTC 2020 - Stefano Torresi <[email protected]>
+
+- Update to upstream 0.9.0 release
+ * [ENHANCEMENT] Add support for python3.9 (#600)
+ * [ENHANCEMENT] Various updates for latest OpenMetrics draft spec (#576 #577)
+
+-------------------------------------------------------------------
Old:
----
v0.8.0.tar.gz
New:
----
v0.9.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-prometheus_client.spec ++++++
--- /var/tmp/diff_new_pack.R7GQzd/_old 2020-11-23 10:45:25.886299042 +0100
+++ /var/tmp/diff_new_pack.R7GQzd/_new 2020-11-23 10:45:25.886299042 +0100
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%bcond_without python2
Name: python-prometheus_client
-Version: 0.8.0
+Version: 0.9.0
Release: 0
Summary: Python client for the Prometheus monitoring system
License: Apache-2.0
++++++ v0.8.0.tar.gz -> v0.9.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/.travis.yml
new/client_python-0.9.0/.travis.yml
--- old/client_python-0.8.0/.travis.yml 2020-05-25 13:59:25.000000000 +0200
+++ new/client_python-0.9.0/.travis.yml 2020-11-16 14:26:28.000000000 +0100
@@ -1,38 +1,57 @@
+os: linux
dist: xenial
-sudo: false
cache:
directories:
- $HOME/.cache/pip
language: python
-matrix:
+jobs:
include:
- - python: "2.6"
+ - stage: lint
+ name: flake8_lint
+ script:
+ - tox -e flake8
+ - stage: lint
+ name: isort_lint
+ script:
+ - tox -e isort
+ - stage: test
+ python: "2.6"
env: TOXENV=py26
dist: trusty
- - python: "2.7"
+ - stage: test
+ python: "2.7"
env: TOXENV=py27
- - python: "2.7"
+ - stage: test
+ python: "2.7"
env: TOXENV=py27-nooptionals
- - python: "3.4"
+ - stage: test
+ python: "3.4"
env: TOXENV=py34
- - python: "3.5"
+ - stage: test
+ python: "3.5"
env: TOXENV=py35
- - python: "3.6"
+ - stage: test
+ python: "3.6"
env: TOXENV=py36
- - python: "3.7"
+ - stage: test
+ python: "3.7"
env: TOXENV=py37
- sudo: true
- - python: "3.8"
+ - stage: test
+ python: "3.8"
env: TOXENV=py38
- sudo: true
- - python: "3.8"
- env: TOXENV=py38-nooptionals
- sudo: true
- - python: "pypy"
+ - stage: test
+ python: "3.9"
+ env: TOXENV=py39
+ - stage: test
+ python: "3.9"
+ env: TOXENV=py39-nooptionals
+ - stage: test
+ python: "pypy"
env: TOXENV=pypy
- - python: "pypy3"
+ - stage: test
+ python: "pypy3"
env: TOXENV=pypy3
install:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/CODE_OF_CONDUCT.md
new/client_python-0.9.0/CODE_OF_CONDUCT.md
--- old/client_python-0.8.0/CODE_OF_CONDUCT.md 1970-01-01 01:00:00.000000000
+0100
+++ new/client_python-0.9.0/CODE_OF_CONDUCT.md 2020-11-16 14:26:28.000000000
+0100
@@ -0,0 +1,3 @@
+## Prometheus Community Code of Conduct
+
+Prometheus follows the [CNCF Code of
Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/README.md
new/client_python-0.9.0/README.md
--- old/client_python-0.8.0/README.md 2020-05-25 13:59:25.000000000 +0200
+++ new/client_python-0.9.0/README.md 2020-11-16 14:26:28.000000000 +0100
@@ -220,6 +220,17 @@
c.labels(method='post', endpoint='/submit').inc()
```
+Metrics with labels are not initialized when declared, because the client can't
+know what values the label can have. It is recommended to initialize the label
+values by calling the `.labels()` method alone:
+
+```python
+from prometheus_client import Counter
+c = Counter('my_requests_total', 'HTTP Failures', ['method', 'endpoint'])
+c.labels('get', '/')
+c.labels('post', '/submit')
+```
+
### Process Collector
The Python client automatically exports metrics about process CPU usage, RAM,
@@ -334,7 +345,7 @@
app = Flask(__name__)
# Add prometheus wsgi middleware to route /metrics requests
-app_dispatch = DispatcherMiddleware(app, {
+app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
'/metrics': make_wsgi_app()
})
```
@@ -344,7 +355,7 @@
```bash
# Install uwsgi if you do not have it
pip install uwsgi
-uwsgi --http 127.0.0.1:8000 --wsgi-file myapp.py --callable app_dispatch
+uwsgi --http 127.0.0.1:8000 --wsgi-file myapp.py --callable app
```
Visit http://localhost:8000/metrics to see the metrics
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/prometheus_client/__init__.py
new/client_python-0.9.0/prometheus_client/__init__.py
--- old/client_python-0.8.0/prometheus_client/__init__.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/__init__.py 2020-11-16
14:26:28.000000000 +0100
@@ -1,12 +1,9 @@
#!/usr/bin/python
-from . import exposition
-from . import gc_collector
-from . import metrics
-from . import metrics_core
-from . import platform_collector
-from . import process_collector
-from . import registry
+from . import (
+ exposition, gc_collector, metrics, metrics_core, platform_collector,
+ process_collector, registry,
+)
__all__ = ['Counter', 'Gauge', 'Summary', 'Histogram', 'Info', 'Enum']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/prometheus_client/core.py
new/client_python-0.9.0/prometheus_client/core.py
--- old/client_python-0.8.0/prometheus_client/core.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/core.py 2020-11-16
14:26:28.000000000 +0100
@@ -2,8 +2,10 @@
from .metrics import Counter, Enum, Gauge, Histogram, Info, Summary
from .metrics_core import (
- CounterMetricFamily, GaugeHistogramMetricFamily, GaugeMetricFamily,
HistogramMetricFamily, InfoMetricFamily,
- Metric, StateSetMetricFamily, SummaryMetricFamily, UnknownMetricFamily,
UntypedMetricFamily)
+ CounterMetricFamily, GaugeHistogramMetricFamily, GaugeMetricFamily,
+ HistogramMetricFamily, InfoMetricFamily, Metric, StateSetMetricFamily,
+ SummaryMetricFamily, UnknownMetricFamily, UntypedMetricFamily,
+)
from .registry import CollectorRegistry, REGISTRY
from .samples import Exemplar, Sample, Timestamp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/prometheus_client/exposition.py
new/client_python-0.9.0/prometheus_client/exposition.py
--- old/client_python-0.8.0/prometheus_client/exposition.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/exposition.py 2020-11-16
14:26:28.000000000 +0100
@@ -6,24 +6,25 @@
import socket
import sys
import threading
-from wsgiref.simple_server import make_server, WSGIServer, WSGIRequestHandler
+from wsgiref.simple_server import make_server, WSGIRequestHandler, WSGIServer
from .openmetrics import exposition as openmetrics
from .registry import REGISTRY
from .utils import floatToGoString
try:
- from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
- from SocketServer import ThreadingMixIn
- from urllib2 import build_opener, Request, HTTPHandler
from urllib import quote_plus
+
+ from BaseHTTPServer import BaseHTTPRequestHandler
+ from SocketServer import ThreadingMixIn
+ from urllib2 import build_opener, HTTPHandler, Request
from urlparse import parse_qs, urlparse
except ImportError:
# Python 3
- from http.server import BaseHTTPRequestHandler, HTTPServer
+ from http.server import BaseHTTPRequestHandler
from socketserver import ThreadingMixIn
- from urllib.request import build_opener, Request, HTTPHandler
- from urllib.parse import quote_plus, parse_qs, urlparse
+ from urllib.parse import parse_qs, quote_plus, urlparse
+ from urllib.request import build_opener, HTTPHandler, Request
CONTENT_TYPE_LATEST = str('text/plain; version=0.0.4; charset=utf-8')
"""Content type of the latest text format"""
@@ -362,7 +363,7 @@
def _escape_grouping_key(k, v):
- if v == "" :
+ if v == "":
# Per https://github.com/prometheus/pushgateway/pull/346.
return k + "@base64", "="
elif '/' in v:
@@ -381,6 +382,6 @@
try:
# Python >3.5 only
- from .asgi import make_asgi_app
+ from .asgi import make_asgi_app # noqa
except:
pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/client_python-0.8.0/prometheus_client/metrics_core.py
new/client_python-0.9.0/prometheus_client/metrics_core.py
--- old/client_python-0.8.0/prometheus_client/metrics_core.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/metrics_core.py 2020-11-16
14:26:28.000000000 +0100
@@ -42,12 +42,12 @@
self.samples.append(Sample(name, labels, value, timestamp, exemplar))
def __eq__(self, other):
- return (isinstance(other, Metric) and
- self.name == other.name and
- self.documentation == other.documentation and
- self.type == other.type and
- self.unit == other.unit and
- self.samples == other.samples)
+ return (isinstance(other, Metric)
+ and self.name == other.name
+ and self.documentation == other.documentation
+ and self.type == other.type
+ and self.unit == other.unit
+ and self.samples == other.samples)
def __repr__(self):
return "Metric(%s, %s, %s, %s, %s)" % (
@@ -216,13 +216,13 @@
timestamp,
exemplar,
))
- # +Inf is last and provides the count value.
- self.samples.append(
- Sample(self.name + '_count', dict(zip(self._labelnames,
labels)), buckets[-1][1], timestamp))
- # Don't iunclude sum if there's negative buckets.
+ # Don't include sum and thus count if there's negative buckets.
if float(buckets[0][0]) >= 0 and sum_value is not None:
+ # +Inf is last and provides the count value.
+ self.samples.append(
+ Sample(self.name + '_count', dict(zip(self._labelnames,
labels)), buckets[-1][1], timestamp))
self.samples.append(
- Sample(self.name + '_sum', dict(zip(self._labelnames,
labels)), sum_value, timestamp))
+ Sample(self.name + '_sum', dict(zip(self._labelnames,
labels)), sum_value, timestamp))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/prometheus_client/mmap_dict.py
new/client_python-0.9.0/prometheus_client/mmap_dict.py
--- old/client_python-0.8.0/prometheus_client/mmap_dict.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/mmap_dict.py 2020-11-16
14:26:28.000000000 +0100
@@ -37,7 +37,7 @@
if encoded_len + pos > used:
raise RuntimeError('Read beyond file size detected, file is
corrupted.')
pos += 4
- encoded_key = data[pos : pos + encoded_len]
+ encoded_key = data[pos:pos + encoded_len]
padded_len = encoded_len + (8 - (encoded_len + 4) % 8)
pos += padded_len
value = _unpack_double(data, pos)[0]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/client_python-0.8.0/prometheus_client/openmetrics/parser.py
new/client_python-0.9.0/prometheus_client/openmetrics/parser.py
--- old/client_python-0.8.0/prometheus_client/openmetrics/parser.py
2020-05-25 13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/openmetrics/parser.py
2020-11-16 14:26:28.000000000 +0100
@@ -15,6 +15,7 @@
# Python 3
import io as StringIO
+
def text_string_to_metric_families(text):
"""Parse Openmetrics text format from a unicode string.
@@ -24,7 +25,7 @@
yield metric_family
-_CANONICAL_NUMBERS = set([i / 1000.0 for i in range(10000)] + [10.0**i for i
in range(-10, 11)] + [float("inf")])
+_CANONICAL_NUMBERS = set([float("inf")])
def _isUncanonicalNumber(s):
@@ -113,8 +114,8 @@
def _is_character_escaped(s, charpos):
num_bslashes = 0
- while (charpos > num_bslashes and
- s[charpos - 1 - num_bslashes] == '\\'):
+ while (charpos > num_bslashes
+ and s[charpos - 1 - num_bslashes] == '\\'):
num_bslashes += 1
return num_bslashes % 2 == 1
@@ -359,7 +360,7 @@
exemplar = None
if exemplar_labels is not None:
exemplar_length = sum([len(k) + len(v) for k, v in
exemplar_labels.items()])
- if exemplar_length > 64:
+ if exemplar_length > 128:
raise ValueError("Exmplar labels are too long: " + text)
exemplar = Exemplar(
exemplar_labels,
@@ -398,6 +399,12 @@
raise ValueError("+Inf bucket missing: " + name)
if count is not None and value != count:
raise ValueError("Count does not match +Inf value: " + name)
+ if has_sum and count is None:
+ raise ValueError("_count must be present if _sum is present: " +
name)
+ if has_gsum and count is None:
+ raise ValueError("_gcount must be present if _gsum is present: " +
name)
+ if not (has_sum or has_gsum) and count is not None:
+ raise ValueError("_sum/_gsum must be present if _count is present:
" + name)
if has_negative_buckets and has_sum:
raise ValueError("Cannot have _sum with negative buckets: " + name)
if not has_negative_buckets and has_negative_gsum:
@@ -413,6 +420,7 @@
bucket = None
has_negative_buckets = False
has_sum = False
+ has_gsum = False
has_negative_gsum = False
value = 0
group = g
@@ -432,8 +440,10 @@
count = s.value
elif suffix in ['_sum']:
has_sum = True
- elif suffix in ['_gsum'] and s.value < 0:
- has_negative_gsum = True
+ elif suffix in ['_gsum']:
+ has_gsum = True
+ if s.value < 0:
+ has_negative_gsum = True
if group is not None:
do_checks()
@@ -452,14 +462,22 @@
allowed_names = []
eof = False
- seen_metrics = set()
+ seen_names = set()
+ type_suffixes = {
+ 'counter': ['_total', '_created'],
+ 'summary': ['', '_count', '_sum', '_created'],
+ 'histogram': ['_count', '_sum', '_bucket', '_created'],
+ 'gaugehistogram': ['_gcount', '_gsum', '_bucket'],
+ 'info': ['_info'],
+ }
def build_metric(name, documentation, typ, unit, samples):
- if name in seen_metrics:
- raise ValueError("Duplicate metric: " + name)
- seen_metrics.add(name)
if typ is None:
typ = 'unknown'
+ for suffix in set(type_suffixes.get(typ, []) + [""]):
+ if name + suffix in seen_names:
+ raise ValueError("Clashing name: " + name + suffix)
+ seen_names.add(name + suffix)
if documentation is None:
documentation = ''
if unit is None:
@@ -482,6 +500,9 @@
if eof:
raise ValueError("Received line after # EOF: " + line)
+ if not line:
+ raise ValueError("Received blank line")
+
if line == '# EOF':
eof = True
elif line.startswith('#'):
@@ -518,14 +539,7 @@
typ = parts[3]
if typ == 'untyped':
raise ValueError("Invalid TYPE for metric: " + line)
- allowed_names = {
- 'counter': ['_total', '_created'],
- 'summary': ['_count', '_sum', '', '_created'],
- 'histogram': ['_count', '_sum', '_bucket', '_created'],
- 'gaugehistogram': ['_gcount', '_gsum', '_bucket'],
- 'info': ['_info'],
- }.get(typ, [''])
- allowed_names = [name + n for n in allowed_names]
+ allowed_names = [name + n for n in type_suffixes.get(typ,
[''])]
elif parts[1] == 'UNIT':
if unit is not None:
raise ValueError("More than one UNIT for metric: " + line)
@@ -557,7 +571,7 @@
raise ValueError("Invalid le label: " + line)
if (typ == 'summary' and name == sample.name
and (not (0 <= float(sample.labels.get('quantile', -1)) <=
1)
- or _isUncanonicalNumber(sample.labels['quantile']))):
+ or _isUncanonicalNumber(sample.labels['quantile']))):
raise ValueError("Invalid quantile label: " + line)
g = tuple(sorted(_group_for_sample(sample, name, typ).items()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/prometheus_client/parser.py
new/client_python-0.9.0/prometheus_client/parser.py
--- old/client_python-0.8.0/prometheus_client/parser.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/parser.py 2020-11-16
14:26:28.000000000 +0100
@@ -46,8 +46,8 @@
def _is_character_escaped(s, charpos):
num_bslashes = 0
- while (charpos > num_bslashes and
- s[charpos - 1 - num_bslashes] == '\\'):
+ while (charpos > num_bslashes
+ and s[charpos - 1 - num_bslashes] == '\\'):
num_bslashes += 1
return num_bslashes % 2 == 1
@@ -112,7 +112,7 @@
if not values:
return float(s), None
value = float(values[0])
- timestamp = (float(values[-1])/1000) if len(values) > 1 else None
+ timestamp = (float(values[-1]) / 1000) if len(values) > 1 else None
return value, timestamp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/prometheus_client/registry.py
new/client_python-0.9.0/prometheus_client/registry.py
--- old/client_python-0.8.0/prometheus_client/registry.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/registry.py 2020-11-16
14:26:28.000000000 +0100
@@ -41,7 +41,7 @@
del self._collector_to_names[collector]
def _get_names(self, collector):
- """Get names of timeseries the collector produces."""
+ """Get names of timeseries the collector produces and clashes with."""
desc_func = None
# If there's a describe function, use it.
try:
@@ -58,13 +58,14 @@
result = []
type_suffixes = {
'counter': ['_total', '_created'],
- 'summary': ['', '_sum', '_count', '_created'],
+ 'summary': ['_sum', '_count', '_created'],
'histogram': ['_bucket', '_sum', '_count', '_created'],
'gaugehistogram': ['_bucket', '_gsum', '_gcount'],
'info': ['_info'],
}
for metric in desc_func():
- for suffix in type_suffixes.get(metric.type, ['']):
+ result.append(metric.name)
+ for suffix in type_suffixes.get(metric.type, []):
result.append(metric.name + suffix)
return result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/client_python-0.8.0/prometheus_client/twisted/_exposition.py
new/client_python-0.9.0/prometheus_client/twisted/_exposition.py
--- old/client_python-0.8.0/prometheus_client/twisted/_exposition.py
2020-05-25 13:59:25.000000000 +0200
+++ new/client_python-0.9.0/prometheus_client/twisted/_exposition.py
2020-11-16 14:26:28.000000000 +0100
@@ -1,7 +1,7 @@
from __future__ import absolute_import, unicode_literals
-from twisted.web.wsgi import WSGIResource
from twisted.internet import reactor
+from twisted.web.wsgi import WSGIResource
from .. import exposition, REGISTRY
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/setup.py
new/client_python-0.9.0/setup.py
--- old/client_python-0.8.0/setup.py 2020-05-25 13:59:25.000000000 +0200
+++ new/client_python-0.9.0/setup.py 2020-11-16 14:26:28.000000000 +0100
@@ -1,17 +1,18 @@
-from setuptools import setup
-import sys
from os import path
+import sys
+
+from setuptools import setup
if sys.version_info >= (2, 7):
with open(path.join(path.abspath(path.dirname(__file__)), 'README.md')) as
f:
long_description = f.read()
-else: # Assuming we don't run setup in order to publish under python 2.6
+else: # Assuming we don't run setup in order to publish under python 2.6
long_description = "NA"
setup(
name="prometheus_client",
- version="0.8.0",
+ version="0.9.0",
author="Brian Brazil",
author_email="[email protected]",
description="Python client for the Prometheus monitoring system.",
@@ -45,6 +46,7 @@
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: System :: Monitoring",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tests/openmetrics/test_parser.py
new/client_python-0.9.0/tests/openmetrics/test_parser.py
--- old/client_python-0.8.0/tests/openmetrics/test_parser.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/tests/openmetrics/test_parser.py 2020-11-16
14:26:28.000000000 +0100
@@ -102,12 +102,14 @@
a_count 1
a_sum 2
a{quantile="0.5"} 0.7
+a{quantile="1"} 0.8
# EOF
""")
# The Python client doesn't support quantiles, but we
# still need to be able to parse them.
metric_family = SummaryMetricFamily("a", "help", count_value=1,
sum_value=2)
metric_family.add_sample("a", {"quantile": "0.5"}, 0.7)
+ metric_family.add_sample("a", {"quantile": "1"}, 0.8)
self.assertEqual([metric_family], list(families))
def test_simple_histogram(self):
@@ -125,9 +127,16 @@
def test_histogram_noncanonical(self):
families = text_string_to_metric_families("""# TYPE a histogram
# HELP a help
+a_bucket{le="0"} 0
a_bucket{le="0.00000000001"} 0
+a_bucket{le="0.0000000001"} 0
+a_bucket{le="1e-04"} 0
a_bucket{le="1.1e-4"} 0
a_bucket{le="1.1e-3"} 0
+a_bucket{le="1.1e-2"} 0
+a_bucket{le="1"} 0
+a_bucket{le="1e+05"} 0
+a_bucket{le="10000000000"} 0
a_bucket{le="100000000000.0"} 0
a_bucket{le="+Inf"} 3
a_count 3
@@ -142,7 +151,6 @@
a_bucket{le="-1.0"} 0
a_bucket{le="1.0"} 1
a_bucket{le="+Inf"} 3
-a_count 3
# EOF
""")
self.assertEqual([HistogramMetricFamily("a", "help", buckets=[("-1.0",
0.0), ("1.0", 1.0), ("+Inf", 3.0)])],
@@ -153,14 +161,14 @@
# HELP a help
a_bucket{le="1.0"} 0 # {a="b"} 0.5
a_bucket{le="2.0"} 2 # {a="c"} 0.5
-a_bucket{le="+Inf"} 3 #
{a="1234567890123456789012345678901234567890123456789012345678"} 4 123
+a_bucket{le="+Inf"} 3 #
{a="2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"}
4 123
# EOF
""")
hfm = HistogramMetricFamily("a", "help")
hfm.add_sample("a_bucket", {"le": "1.0"}, 0.0, None, Exemplar({"a":
"b"}, 0.5))
hfm.add_sample("a_bucket", {"le": "2.0"}, 2.0, None, Exemplar({"a":
"c"}, 0.5)),
hfm.add_sample("a_bucket", {"le": "+Inf"}, 3.0, None,
- Exemplar({"a":
"1234567890123456789012345678901234567890123456789012345678"}, 4,
+ Exemplar({"a":
"2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"},
4,
Timestamp(123, 0)))
self.assertEqual([hfm], list(families))
@@ -468,6 +476,7 @@
@unittest.skipIf(sys.version_info < (3, 3), "Test requires Python 3.3+.")
def test_fallback_to_state_machine_label_parsing(self):
from unittest.mock import patch
+
from prometheus_client.openmetrics.parser import _parse_sample
parse_sample_function =
"prometheus_client.openmetrics.parser._parse_sample"
@@ -598,6 +607,8 @@
for case in [
# No EOF.
(''),
+ # Blank line
+ ('a 1\n\n# EOF\n'),
# Text after EOF.
('a 1\n# EOF\nblah'),
('a 1\n# EOFblah'),
@@ -692,7 +703,7 @@
('# TYPE a histogram\na_bucket{le="+Inf"} 1 # {} 1 \n# EOF\n'),
('# TYPE a histogram\na_bucket{le="+Inf"} 1 # {} 1 1 \n# EOF\n'),
('# TYPE a histogram\na_bucket{le="+Inf"} 1 # '
-
'{a="2345678901234567890123456789012345678901234567890123456789012345"} 1 1\n#
EOF\n'),
+
'{a="23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"}
1 1\n# EOF\n'),
('# TYPE a histogram\na_bucket{le="+Inf"} 1 # {} 0x1p-3\n# EOF\n'),
('# TYPE a histogram\na_bucket{le="+Inf"} 1 # {} 1 0x1p-3\n#
EOF\n'),
# Exemplars on unallowed samples.
@@ -715,7 +726,6 @@
('# TYPE a summary\na{quantile="foo"} 0\n# EOF\n'),
('# TYPE a summary\na{quantile="1.01"} 0\n# EOF\n'),
('# TYPE a summary\na{quantile="NaN"} 0\n# EOF\n'),
- ('# TYPE a summary\na{quantile="1"} 0\n# EOF\n'),
('# TYPE a histogram\na_bucket 0\n# EOF\n'),
('# TYPE a gaugehistogram\na_bucket 0\n# EOF\n'),
('# TYPE a stateset\na 0\n# EOF\n'),
@@ -742,16 +752,13 @@
('# TYPE a summary\na{quantile="0.5"} -1\n# EOF\n'),
# Bad histograms.
('# TYPE a histogram\na_sum 1\n# EOF\n'),
+ ('# TYPE a histogram\na_bucket{le="+Inf"} 0\n#a_sum 0\n# EOF\n'),
+ ('# TYPE a histogram\na_bucket{le="+Inf"} 0\n#a_count 0\n# EOF\n'),
('# TYPE a gaugehistogram\na_gsum 1\n# EOF\n'),
+ ('# TYPE a gaugehistogram\na_bucket{le="+Inf"} 0\na_gsum 0\n#
EOF\n'),
+ ('# TYPE a gaugehistogram\na_bucket{le="+Inf"} 0\na_gcount 0\n#
EOF\n'),
('# TYPE a histogram\na_count 1\na_bucket{le="+Inf"} 0\n# EOF\n'),
('# TYPE a histogram\na_bucket{le="+Inf"} 0\na_count 1\n# EOF\n'),
- ('# TYPE a histogram\na_bucket{le="0"} 0\na_bucket{le="+Inf"} 0\n#
EOF\n'),
- ('# TYPE a histogram\na_bucket{le="1"} 0\na_bucket{le="+Inf"} 0\n#
EOF\n'),
- ('# TYPE a histogram\na_bucket{le="0.0000000001"}
0\na_bucket{le="+Inf"} 0\n# EOF\n'),
- ('# TYPE a histogram\na_bucket{le="1.1e-2"} 0\na_bucket{le="+Inf"}
0\n# EOF\n'),
- ('# TYPE a histogram\na_bucket{le="1e-04"} 0\na_bucket{le="+Inf"}
0\n# EOF\n'),
- ('# TYPE a histogram\na_bucket{le="1e+05"} 0\na_bucket{le="+Inf"}
0\n# EOF\n'),
- ('# TYPE a histogram\na_bucket{le="10000000000"}
0\na_bucket{le="+Inf"} 0\n# EOF\n'),
('# TYPE a histogram\na_bucket{le="+INF"} 0\n# EOF\n'),
('# TYPE a histogram\na_bucket{le="2"} 0\na_bucket{le="1"}
0\na_bucket{le="+Inf"} 0\n# EOF\n'),
('# TYPE a histogram\na_bucket{le="1"} 1\na_bucket{le="2"}
1\na_bucket{le="+Inf"} 0\n# EOF\n'),
@@ -768,6 +775,10 @@
('# TYPE a gauge\na 0 1\na 0 0\n# EOF\n'),
('# TYPE a gauge\na 0\na 0 0\n# EOF\n'),
('# TYPE a gauge\na 0 0\na 0\n# EOF\n'),
+ # Clashing names.
+ ('# TYPE a counter\n# TYPE a counter\n# EOF\n'),
+ ('# TYPE a info\n# TYPE a counter\n# EOF\n'),
+ ('# TYPE a_created gauge\n# TYPE a counter\n# EOF\n'),
]:
with self.assertRaises(ValueError, msg=case):
list(text_string_to_metric_families(case))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tests/test_asgi.py
new/client_python-0.9.0/tests/test_asgi.py
--- old/client_python-0.8.0/tests/test_asgi.py 2020-05-25 13:59:25.000000000
+0200
+++ new/client_python-0.9.0/tests/test_asgi.py 2020-11-16 14:26:28.000000000
+0100
@@ -3,7 +3,7 @@
import sys
from unittest import TestCase
-from prometheus_client import CollectorRegistry, Counter, generate_latest
+from prometheus_client import CollectorRegistry, Counter
from prometheus_client.exposition import CONTENT_TYPE_LATEST
if sys.version_info < (2, 7):
@@ -13,9 +13,11 @@
try:
# Python >3.5 only
- from prometheus_client import make_asgi_app
import asyncio
+
from asgiref.testing import ApplicationCommunicator
+
+ from prometheus_client import make_asgi_app
HAVE_ASYNCIO_AND_ASGI = True
except ImportError:
HAVE_ASYNCIO_AND_ASGI = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tests/test_core.py
new/client_python-0.9.0/tests/test_core.py
--- old/client_python-0.8.0/tests/test_core.py 2020-05-25 13:59:25.000000000
+0200
+++ new/client_python-0.9.0/tests/test_core.py 2020-11-16 14:26:28.000000000
+0100
@@ -1,7 +1,6 @@
from __future__ import unicode_literals
from concurrent.futures import ThreadPoolExecutor
-import inspect
import time
import pytest
@@ -12,6 +11,7 @@
HistogramMetricFamily, Info, InfoMetricFamily, Metric, Sample,
StateSetMetricFamily, Summary, SummaryMetricFamily, UntypedMetricFamily,
)
+from prometheus_client.decorator import getargspec
try:
import unittest2 as unittest
@@ -46,7 +46,7 @@
else:
raise TypeError
- self.assertEqual((["r"], None, None, None), inspect.getargspec(f))
+ self.assertEqual((["r"], None, None, None), getargspec(f))
try:
f(False)
@@ -107,7 +107,7 @@
def f():
self.assertEqual(1, self.registry.get_sample_value('g'))
- self.assertEqual(([], None, None, None), inspect.getargspec(f))
+ self.assertEqual(([], None, None, None), getargspec(f))
f()
self.assertEqual(0, self.registry.get_sample_value('g'))
@@ -134,7 +134,7 @@
def f():
time.sleep(.001)
- self.assertEqual(([], None, None, None), inspect.getargspec(f))
+ self.assertEqual(([], None, None, None), getargspec(f))
f()
self.assertNotEqual(0, self.registry.get_sample_value('g'))
@@ -204,7 +204,7 @@
def f():
pass
- self.assertEqual(([], None, None, None), inspect.getargspec(f))
+ self.assertEqual(([], None, None, None), getargspec(f))
f()
self.assertEqual(1, self.registry.get_sample_value('s_count'))
@@ -345,7 +345,7 @@
def f():
pass
- self.assertEqual(([], None, None, None), inspect.getargspec(f))
+ self.assertEqual(([], None, None, None), getargspec(f))
f()
self.assertEqual(1, self.registry.get_sample_value('h_count'))
@@ -528,9 +528,8 @@
self.assertRaises(ValueError, Enum, 'foo', 'help', unit="x")
def test_name_cleanup_before_unit_append(self):
- self.assertEqual(self.counter._name, 'c')
- self.c = Counter('c_total', 'help', unit="total", labelnames=['l'],
registry=self.registry)
- self.assertEqual(self.c._name, 'c_total')
+ c = Counter('b_total', 'help', unit="total", labelnames=['l'],
registry=self.registry)
+ self.assertEqual(c._name, 'b_total')
class TestMetricFamilies(unittest.TestCase):
@@ -717,8 +716,8 @@
self.assertRaises(ValueError, Gauge, 'h_sum', 'help',
registry=registry)
self.assertRaises(ValueError, Gauge, 'h_bucket', 'help',
registry=registry)
self.assertRaises(ValueError, Gauge, 'h_created', 'help',
registry=registry)
- # The name of the histogram itself isn't taken.
- Gauge('h', 'help', registry=registry)
+ # The name of the histogram itself is also taken.
+ self.assertRaises(ValueError, Gauge, 'h', 'help', registry=registry)
Info('i', 'help', registry=registry)
self.assertRaises(ValueError, Gauge, 'i_info', 'help',
registry=registry)
@@ -753,7 +752,7 @@
m = Metric('s', 'help', 'summary')
m.samples = [Sample('s_sum', {}, 7)]
- self.assertEquals([m],
registry.restricted_registry(['s_sum']).collect())
+ self.assertEqual([m],
registry.restricted_registry(['s_sum']).collect())
def test_target_info_injected(self):
registry = CollectorRegistry(target_info={'foo': 'bar'})
@@ -777,11 +776,11 @@
m = Metric('s', 'help', 'summary')
m.samples = [Sample('s_sum', {}, 7)]
- self.assertEquals([m],
registry.restricted_registry(['s_sum']).collect())
+ self.assertEqual([m],
registry.restricted_registry(['s_sum']).collect())
m = Metric('target', 'Target metadata', 'info')
m.samples = [Sample('target_info', {'foo': 'bar'}, 1)]
- self.assertEquals([m],
registry.restricted_registry(['target_info']).collect())
+ self.assertEqual([m],
registry.restricted_registry(['target_info']).collect())
if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tests/test_exposition.py
new/client_python-0.9.0/tests/test_exposition.py
--- old/client_python-0.8.0/tests/test_exposition.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/tests/test_exposition.py 2020-11-16
14:26:28.000000000 +0100
@@ -7,14 +7,13 @@
import pytest
from prometheus_client import (
- CollectorRegistry, CONTENT_TYPE_LATEST, Counter, delete_from_gateway, Enum,
- Gauge, generate_latest, Histogram, Info, instance_ip_grouping_key, Metric,
- push_to_gateway, pushadd_to_gateway, Summary,
+ CollectorRegistry, CONTENT_TYPE_LATEST, core, Counter, delete_from_gateway,
+ Enum, Gauge, generate_latest, Histogram, Info, instance_ip_grouping_key,
+ Metric, push_to_gateway, pushadd_to_gateway, Summary,
)
-from prometheus_client import core
from prometheus_client.core import GaugeHistogramMetricFamily, Timestamp
from prometheus_client.exposition import (
- basic_auth_handler, default_handler, MetricsHandler
+ basic_auth_handler, default_handler, MetricsHandler,
)
if sys.version_info < (2, 7):
@@ -24,12 +23,10 @@
import unittest
try:
- from BaseHTTPServer import BaseHTTPRequestHandler
- from BaseHTTPServer import HTTPServer
+ from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
except ImportError:
# Python 3
- from http.server import BaseHTTPRequestHandler
- from http.server import HTTPServer
+ from http.server import BaseHTTPRequestHandler, HTTPServer
class TestGenerateText(unittest.TestCase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tests/test_twisted.py
new/client_python-0.9.0/tests/test_twisted.py
--- old/client_python-0.8.0/tests/test_twisted.py 2020-05-25
13:59:25.000000000 +0200
+++ new/client_python-0.9.0/tests/test_twisted.py 2020-11-16
14:26:28.000000000 +0100
@@ -10,14 +10,13 @@
from unittest import skipUnless
try:
- from prometheus_client.twisted import MetricsResource
-
+ from twisted.internet import reactor
from twisted.trial.unittest import TestCase
- from twisted.web.server import Site
+ from twisted.web.client import Agent, readBody
from twisted.web.resource import Resource
- from twisted.internet import reactor
- from twisted.web.client import Agent
- from twisted.web.client import readBody
+ from twisted.web.server import Site
+
+ from prometheus_client.twisted import MetricsResource
HAVE_TWISTED = True
except ImportError:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tests/test_wsgi.py
new/client_python-0.9.0/tests/test_wsgi.py
--- old/client_python-0.8.0/tests/test_wsgi.py 2020-05-25 13:59:25.000000000
+0200
+++ new/client_python-0.9.0/tests/test_wsgi.py 2020-11-16 14:26:28.000000000
+0100
@@ -1,11 +1,9 @@
from __future__ import absolute_import, unicode_literals
-import sys
from unittest import TestCase
from wsgiref.util import setup_testing_defaults
-from prometheus_client import make_wsgi_app
-from prometheus_client import CollectorRegistry, Counter, generate_latest
+from prometheus_client import CollectorRegistry, Counter, make_wsgi_app
from prometheus_client.exposition import CONTENT_TYPE_LATEST
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/client_python-0.8.0/tox.ini
new/client_python-0.9.0/tox.ini
--- old/client_python-0.8.0/tox.ini 2020-05-25 13:59:25.000000000 +0200
+++ new/client_python-0.9.0/tox.ini 2020-11-16 14:26:28.000000000 +0100
@@ -1,5 +1,5 @@
[tox]
-envlist =
coverage-clean,py26,py27,py34,py35,py36,py37,py38,pypy,pypy3,{py27,py38}-nooptionals,coverage-report,flake8
+envlist =
coverage-clean,py26,py27,py34,py35,py36,py37,py38,py39,pypy,pypy3,{py27,py39}-nooptionals,coverage-report,flake8,isort
[base]
@@ -40,7 +40,7 @@
futures
commands = coverage run --parallel -m pytest {posargs}
-[testenv:py38-nooptionals]
+[testenv:py39-nooptionals]
commands = coverage run --parallel -m pytest {posargs}
[testenv:coverage-clean]
@@ -66,6 +66,12 @@
commands =
flake8 prometheus_client/ tests/ setup.py
+[testenv:isort]
+deps =
+ isort==5.5.4
+skip_install = true
+commands =
+ isort --check prometheus_client/ tests/ setup.py
[flake8]
ignore =
@@ -80,7 +86,9 @@
W291,
W293,
W503,
- E129
+ E129,
+ E731
+
import-order-style = google
application-import-names = prometheus_client
_______________________________________________
openSUSE Commits mailing list -- [email protected]
To unsubscribe, email [email protected]
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives:
https://lists.opensuse.org/archives/list/[email protected]