From 1b582a7cdb11d1af5e77a44510d74a20515125e0 Mon Sep 17 00:00:00 2001 From: Scott Anderson <sanderson@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:25:20 -0600 Subject: [PATCH] Work with Prometheus metrics in Flux (#3232) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * initial changes for flux restructure * added all aliases * added introduced date to all flux functions * marked linearBins and logarithmicBins as draft * migrated flux stdlib to new flux section, added version range to article template * fixed list-all-functions shortcode * duplicated and reordered flux spec, added page-nav shortcode, closes #1870 * added filtering functionality to list-all-functions shortcode * added function tags * Stdlib reorg (#2130) * consolidated influxdb packages * stdlib rename and reorg * reorg existing contrib docs * added keep-url to http.get example * reorg built-in directory, add function types docs * updated links * updated all related links * fixed reference links in influxdb docs * updated all internal flux links * updated flux links in influxdb * one last link update * restyle product dropdown * update flux links in influxdb 1.7 and 1.8 * fixed shortcode call * updated task options in flux options doc * Flux 'interpolate' package (#2148) * add interpolate package, closes #1649 * added missing page description to interpolate package doc * removed unnecessary space from interpolate description * updated interpolate package description * ported from() note to new flux section * New list filter javascript (#2185) * generalized list filtering for telegraf plugins and flux functions * added flux tags, updated filter list functionality * added more flux tags * added new experimental functions * updated derivative params * ported over new experimental functions * fixed bad copy-pasta * ported new notification endpoints into new flux docs * updated flux function categories * ported flux changes from master * fixed product dropdown * fixed regexp.findString example * ported flux 0.109 changes * updated array package aliases and supported version * ported new functions into flux dir * added aliases to interpolate package * ported flux v0.114 packages * added enterpise logic to url selector modal * fix minor typo * Update Flux param type convention (#2515) * fix minor typo * WIP new flux data type convention * wip more param type updates * cleaned up function type specs * ported flux 0.115.0 packages and functions * ported tickscript package * ported today function * added aliases to tickscript pkg * updated timedMovingAverage params example * updated to function with remote creds * port flux 0.118 changes over * port flux changes into flux-restructure * ported changes from flux 0.123.0 and updated flux function docs * updated contrib package summary * updated function definition of schema.tagValues * ported recent flux changes to the restructure branch * port changes from master * Flux get started (#3036) * Flux group keys demo (#2553) * interactive group key example * added js and shortcode for group key demo * updated group key demo to address PR feedback * shortened sample data set * Flux get started intro and data model (#2619) * starting flux intro content, resolved merge conflicts * WIP flux get started docs * WIP flux get started * flux get started intro and data model * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Update content/flux/v0.x/get-started/data-model.md Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * addressed PR feedback in flux get started * updated flux docs landing page * more updates to flux landing page Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Flux query basics (#2887) * WIP flux query basics * WIP flux query basics * WIP flux query basics * WIP flux query basics * wrap up content for flux query basics * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * properly close code block on flux query basics * Flux – query data (#2891) * added query data sources with flux and query influxdb * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Update content/flux/v0.x/query-data/influxdb.md * Query Prometheus with Flux (#2893) * query prometheus with flux * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Query CSV data with Flux (#2895) * query csv data with flux * address PR feedback * Update content/flux/v0.x/query-data/csv.md * update flux query data sources landing page * updated flux query data doc formats and links * Query SQL databases (#2922) * WIP query sql guides * query SQL data sources, closes #1738 * updated related link on sql.from * added link to stream of tables and updated text * updated connection string text * updated query sql landing page and children hr styles * updated sql query docs to address PR feedback * added missing colon * Query Google Cloud Bigtable with Flux (#2928) * Query Google Cloud Bigtable with Flux * updated doc structure of query bigtable doc * fixed typo in bigquery doc * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Work with Flux data types (#2967) * scaffolding for flux types, work with strings * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * removed note about interpolation vs concatenation * updated wording of variable type association * generalized type inference * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * WIP work with ints * reverted int content * updated strings doc to address PR feedback * added description to data types landing page * Apply suggestions from code review * Update content/flux/v0.x/data-types/basic/string.md * updated composite front-matter * Work with time types in Flux (#2974) * work with time types in flux, closes #2260 * updated time type doc * fixed type in time type description * fixed typo * updated work with time doc * fixed typos * updated verbiage * added related links * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * updated time type doc to address PR feedback Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Work with booleans (#2975) * work with boolean types * updated working with booleans * updated verbiage * added related links * Update content/flux/v0.x/data-types/basic/boolean.md * Work with bytes types (#2976) * work with bytes types * added toc to bytes type doc * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * updated work with bytes doc * fixed typo * added related links Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Work with durations (#2977) * work with durations in flux * added keywords to duration doc to improve searchability * minor updates to duration type doc * updated verbiage * added related links and removed toDuration from menu * Update content/flux/v0.x/data-types/basic/duration.md * Work with null types (#2978) * WIP null types * work with null types in flux * updated null types doc * Update content/flux/v0.x/data-types/basic/null.md Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Work with floats (#2979) * work with floats in flux * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Apply suggestions from code review * updated floats type doc * Update content/flux/v0.x/data-types/basic/float.md * updated verbiage * added related links * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Work with integers (#2980) * WIP work with ints * work with integers * work with integers * updated float to int behavior, added related links, closes #2973 * added toc to ints doc * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Update content/flux/v0.x/data-types/basic/integer.md Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Work with uintegers (#2981) * WIP work with uints * work with uints * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * fixed minor type * Work with records (#2982) * work with records in flux * updated record type doc * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Work with arrays (#2983) * work with arrays * added array.from example, added related links * Work with dictionaries (#2984) * WIP work with dicts * work with dictionaries * added related links to dict package * added introduced version to dict package * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * added sample dict output Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Work with functions (#2985) * work with functions * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * revamped type landing pages * marked union types as draft * miscellaneous updates * Work with regular expression (#3024) * work with regular expression types, closes #2573, closes influxdata/flux#3741 * add context for quoteMeta function * Apply suggestions from code review Co-authored-by: Jason Stirnaman <jstirnaman@influxdata.com> Co-authored-by: Jason Stirnaman <jstirnaman@influxdata.com> Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: Jason Stirnaman <jstirnaman@influxdata.com> * fix latest links in page descriptions * updated influxdb links * Flux syntax basics (#3033) * flux syntax basics * Apply suggestions from code review Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> * updated function description * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Apply suggestions from code review * Update content/flux/v0.x/get-started/syntax-basics.md Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: Jason Stirnaman <jstirnaman@influxdata.com> * added table param to transformations, closes #2392 (#3039) * updated flux function links * update algolia configuration to fix search, closes #1902 (#3042) * ported notes in the from function doc * Flux package options (#3083) * add now option to universe package * added missing package options, closes #2464 * addressed PR feedback * Flux transformation input/output examples (#3103) * added flux/sample shortcode * standardize flux package titles and list titles * added start and stop columns as an option with flux/sample shortcode * minor updates to stdlib * WIP add input and output examples to flux transformations * WIP removed sample data demo from universe index page * WIP function input and output examples * WIP flux input output examples * WIP flux input output examples * flux transformation input and output examples * Add Flux 'sampledata' package (#3088) * add flux sampledata package * updated sampledata example titles * Write data with Flux (#3084) * WIP write to sql data sources * write to sql data sources * added write data to influxdb with flux doc * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * made sql headings specific to each db * updated write to influxdb * added tag to influxdb to example * restructred influxdb write examples as code tabs Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * fixed list on influxdb write with flux page * Flux move changelog (#3117) * updated flux redirects in edge.js * move flux changelog into Flux restructure * add flux redirects to edge.js * removed extra parentheses from monitor.notify examples, closes #2505 * updated flux release notes with flux 0.129.0 * moved from and to into the influxdata/influxdb package * updated notes on to and from docs * added flux card to homepage * added flux-0.130.0 to flux release notes * flux link cleanup * updated experimental message, closes #3097 (#3128) * Remove Flux stdlib and language from InfluxDB (#3133) * remove flux stdlib and lang from influxdb, update flux get-started, closes #2132 * flux link cleanup * cleaned up prometheus verbiage, updated flux data type links * function cleanup * fixed sidenav toggle button * updated group key links, added aliases for flux landing page * WIP prometheus rework * fixed broken links, commented out prometheus content, updated flux types names * added flux links to the left nav * fixed flux links in kapacitor docs * WIP flux prometheus docs * WIP prometheus metrics * added note about prom metrics data structures * resolved merge conflicts * added prometheus doc in write data, added prometheus metric versions ref doc * added prometheus counter contnet * resolved merge conflict * WIP flux prometheus histograms * added content for prometheus summaries * added histogram content * removed commented notes * Apply suggestions from code review Co-authored-by: Jason Stirnaman <jstirnaman@influxdata.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> * updates to address pr feedback * updated prometheus-metrics.md Co-authored-by: pierwill <19642016+pierwill@users.noreply.github.com> Co-authored-by: kelseiv <47797004+kelseiv@users.noreply.github.com> Co-authored-by: Jason Stirnaman <jstirnaman@influxdata.com> --- assets/js/flux-current-time.js | 4 + assets/styles/layouts/_article.scss | 2 + assets/styles/layouts/article/_blocks.scss | 7 + assets/styles/layouts/article/_captions.scss | 2 +- assets/styles/layouts/article/_flex.scss | 2 + .../layouts/article/_tabbed-content.scss | 7 + content/flux/v0.x/prometheus/_index.md | 17 + .../v0.x/prometheus/metric-types/_index.md | 22 + .../v0.x/prometheus/metric-types/counter.md | 516 ++++++++++++++++++ .../v0.x/prometheus/metric-types/gauge.md | 315 +++++++++++ .../v0.x/prometheus/metric-types/histogram.md | 171 ++++++ .../v0.x/prometheus/metric-types/summary.md | 138 +++++ .../flux/v0.x/prometheus/scrape-prometheus.md | 193 +++++++ .../stdlib/experimental/prometheus/scrape.md | 1 + .../cloud/query-data/flux/histograms.md | 1 + .../cloud/reference/prometheus-metrics.md | 19 + .../scrape-prometheus-metrics.md | 20 + .../v2.0/query-data/flux/histograms.md | 124 +---- content/influxdb/v2.0/reference/glossary.md | 2 +- .../v2.0/reference/prometheus-metrics.md | 286 ++++++++++ .../scrape-prometheus-metrics.md | 105 ++++ .../write-data/no-code/scrape-data/_index.md | 4 +- .../scrape-data/manage-scrapers/_index.md | 6 +- .../manage-scrapers/create-a-scraper.md | 6 +- .../manage-scrapers/delete-a-scraper.md | 6 +- .../manage-scrapers/update-a-scraper.md | 6 +- .../scrape-data/scrapable-endpoints.md | 2 +- layouts/partials/footer/javascript.html | 7 + layouts/shortcodes/cite.html | 1 + layouts/shortcodes/flex-content.html | 2 +- layouts/shortcodes/flex.html | 2 +- layouts/shortcodes/flux/current-time.html | 1 + layouts/shortcodes/img-hd.html | 12 +- layouts/shortcodes/nowrap.html | 2 +- layouts/shortcodes/tabs.html | 4 +- ...ometheus-counter-aggregate-rate-output.png | Bin 0 -> 11242 bytes ...x-prometheus-counter-derivative-output.png | Bin 0 -> 11779 bytes ...x-prometheus-counter-difference-output.png | Bin 0 -> 12599 bytes .../0-x-prometheus-counter-increase-input.png | Bin 0 -> 10937 bytes ...0-x-prometheus-counter-increase-output.png | Bin 0 -> 9299 bytes ...-x-prometheus-counter-normalized-input.png | Bin 0 -> 9095 bytes ...prometheus-gauge-aggregate-rate-output.png | Bin 0 -> 10763 bytes ...0-x-prometheus-gauge-derivative-output.png | Bin 0 -> 11626 bytes .../img/flux/0-x-prometheus-gauge-input.png | Bin 0 -> 10838 bytes ...rometheus-histogram-multiple-quantiles.png | Bin 0 -> 22451 bytes .../0-x-prometheus-histogram-quantile.png | Bin 0 -> 16141 bytes .../flux/0-x-prometheus-summary-quantiles.png | Bin 0 -> 19016 bytes 47 files changed, 1865 insertions(+), 150 deletions(-) create mode 100644 assets/js/flux-current-time.js create mode 100644 content/flux/v0.x/prometheus/_index.md create mode 100644 content/flux/v0.x/prometheus/metric-types/_index.md create mode 100644 content/flux/v0.x/prometheus/metric-types/counter.md create mode 100644 content/flux/v0.x/prometheus/metric-types/gauge.md create mode 100644 content/flux/v0.x/prometheus/metric-types/histogram.md create mode 100644 content/flux/v0.x/prometheus/metric-types/summary.md create mode 100644 content/flux/v0.x/prometheus/scrape-prometheus.md create mode 100644 content/influxdb/cloud/reference/prometheus-metrics.md create mode 100644 content/influxdb/cloud/write-data/developer-tools/scrape-prometheus-metrics.md create mode 100644 content/influxdb/v2.0/reference/prometheus-metrics.md create mode 100644 content/influxdb/v2.0/write-data/developer-tools/scrape-prometheus-metrics.md create mode 100644 layouts/shortcodes/cite.html create mode 100644 layouts/shortcodes/flux/current-time.html create mode 100644 static/img/flux/0-x-prometheus-counter-aggregate-rate-output.png create mode 100644 static/img/flux/0-x-prometheus-counter-derivative-output.png create mode 100644 static/img/flux/0-x-prometheus-counter-difference-output.png create mode 100644 static/img/flux/0-x-prometheus-counter-increase-input.png create mode 100644 static/img/flux/0-x-prometheus-counter-increase-output.png create mode 100644 static/img/flux/0-x-prometheus-counter-normalized-input.png create mode 100644 static/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png create mode 100644 static/img/flux/0-x-prometheus-gauge-derivative-output.png create mode 100644 static/img/flux/0-x-prometheus-gauge-input.png create mode 100644 static/img/flux/0-x-prometheus-histogram-multiple-quantiles.png create mode 100644 static/img/flux/0-x-prometheus-histogram-quantile.png create mode 100644 static/img/flux/0-x-prometheus-summary-quantiles.png diff --git a/assets/js/flux-current-time.js b/assets/js/flux-current-time.js new file mode 100644 index 000000000..f48a760b0 --- /dev/null +++ b/assets/js/flux-current-time.js @@ -0,0 +1,4 @@ +var date = new Date() +var timestamp = date.toISOString().replace(/^(.*)(\.\d+)(Z)/, '$1$3') + +$('span.current-time').text(timestamp) \ No newline at end of file diff --git a/assets/styles/layouts/_article.scss b/assets/styles/layouts/_article.scss index c254dca85..d8a950efa 100644 --- a/assets/styles/layouts/_article.scss +++ b/assets/styles/layouts/_article.scss @@ -184,6 +184,8 @@ } } + .nowrap { white-space: nowrap } + /////////////////////////// Getting Started Buttons ////////////////////////// .get-started-btns { diff --git a/assets/styles/layouts/article/_blocks.scss b/assets/styles/layouts/article/_blocks.scss index e226c6bbb..9205b0134 100644 --- a/assets/styles/layouts/article/_blocks.scss +++ b/assets/styles/layouts/article/_blocks.scss @@ -23,6 +23,13 @@ blockquote { color: rgba($article-text, .5); } *:last-child {margin-bottom: 0;} + .cite { + display: block; + margin-top: -1rem; + font-style: italic; + font-size: .85rem; + opacity: .8; + } } //////////////////////////////////////////////////////////////////////////////// diff --git a/assets/styles/layouts/article/_captions.scss b/assets/styles/layouts/article/_captions.scss index bf2cd3881..e01397b0d 100644 --- a/assets/styles/layouts/article/_captions.scss +++ b/assets/styles/layouts/article/_captions.scss @@ -28,4 +28,4 @@ h2,h3,h4,h5,h6 { margin: 0; opacity: 1; } -} \ No newline at end of file +} diff --git a/assets/styles/layouts/article/_flex.scss b/assets/styles/layouts/article/_flex.scss index e28f7265d..60bbee7fa 100644 --- a/assets/styles/layouts/article/_flex.scss +++ b/assets/styles/layouts/article/_flex.scss @@ -16,6 +16,8 @@ &.half, &.third, &.quarter { table:not(:last-child) {margin-right: 1rem;} } + + img { margin-bottom: 0;} } //////////////////////////////////////////////////////////////////////////////// diff --git a/assets/styles/layouts/article/_tabbed-content.scss b/assets/styles/layouts/article/_tabbed-content.scss index 57fd2bdb3..450169d6e 100644 --- a/assets/styles/layouts/article/_tabbed-content.scss +++ b/assets/styles/layouts/article/_tabbed-content.scss @@ -52,6 +52,13 @@ } } } + &.small { + p { justify-content: flex-start; } + a { + flex-grow: unset; + padding: 0rem .5rem; + } + } } .code-tabs { diff --git a/content/flux/v0.x/prometheus/_index.md b/content/flux/v0.x/prometheus/_index.md new file mode 100644 index 000000000..b13035fe0 --- /dev/null +++ b/content/flux/v0.x/prometheus/_index.md @@ -0,0 +1,17 @@ +--- +title: Work with Prometheus +description: > + Flux provides tools for scraping and processing raw [Prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/) + from an HTTP-accessible endpoint. +menu: flux_0_x +weight: 8 +flux/v0.x/tags: [prometheus] +--- + +[Prometheus](https://prometheus.io/) is an open-source toolkit designed +to build simple and robust monitoring and alerting systems. +Flux provides tools for scraping raw [Prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/) +from an HTTP-accessible endpoint, writing them to InfluxDB, then processing those +raw metrics for visualization in InfluxDB dashboards. + +{{< children >}} \ No newline at end of file diff --git a/content/flux/v0.x/prometheus/metric-types/_index.md b/content/flux/v0.x/prometheus/metric-types/_index.md new file mode 100644 index 000000000..972799bb7 --- /dev/null +++ b/content/flux/v0.x/prometheus/metric-types/_index.md @@ -0,0 +1,22 @@ +--- +title: Work with Prometheus metric types +description: > + Learn how to use Flux to work with Prometheus' four main metric types + (counter, gauge, histogram, and summary) and process them for visualizations + in InfluxDB dashboards. +menu: + flux_0_x: + name: Prometheus metric types + parent: Work with Prometheus +weight: 102 +cascade: + related: + - https://prometheus.io/docs/concepts/metric_types/, Prometheus metric types +flux/v0.x/tags: [prometheus] +--- + +Learn how to use Flux to work with the four core +[Prometheus metric types](https://prometheus.io/docs/concepts/metric_types/) and +process them for visualizations in InfluxDB dashboards: + +{{< children >}} diff --git a/content/flux/v0.x/prometheus/metric-types/counter.md b/content/flux/v0.x/prometheus/metric-types/counter.md new file mode 100644 index 000000000..249d95489 --- /dev/null +++ b/content/flux/v0.x/prometheus/metric-types/counter.md @@ -0,0 +1,516 @@ +--- +title: Work with Prometheus counters +list_title: Counter +description: > + Use Flux to query and transform Prometheus **counter** metrics stored in InfluxDB. + A counter is a cumulative metric that represents a single + [monotonically increasing counter](https://en.wikipedia.org/wiki/Monotonic_function) + whose value can only increase or be reset to zero on restart. +menu: + flux_0_x: + name: Counter + parent: Prometheus metric types +weight: 101 +related: + - https://prometheus.io/docs/concepts/metric_types/, Prometheus metric types + - /{{< latest "influxdb" >}}/reference/prometheus-metrics/ +flux/v0.x/tags: [prometheus] +--- + +Use Flux to query and transform Prometheus **counter** metrics stored in InfluxDB. + +> A _counter_ is a cumulative metric that represents a single +> [monotonically increasing counter](https://en.wikipedia.org/wiki/Monotonic_function) +> whose value can only increase or be reset to zero on restart. +> +> {{% cite %}}[Prometheus metric types](https://prometheus.io/docs/concepts/metric_types/#counter){{% /cite %}} + +##### Example counter metric in Prometheus format +```sh +# HELP example_counter_total Total representing an example counter metric +# TYPE example_counter_total counter +example_counter_total 282327 +``` + +Because counters can periodically reset to 0, **any query involving counter +metrics should [normalize the data](#normalize-counter-resets) to account for +counter resets** before further processing. + +The examples below include example data collected from the **InfluxDB OSS 2.x `/metrics` endpoint** +using `prometheus.scrape()` and stored in InfluxDB. + +{{% note %}} +#### Prometheus metric parsing formats +Query structure depends on the [Prometheus metric parsing format](/{{< latest "influxdb" >}}/reference/prometheus-metrics/) +used to scrape the Prometheus metrics. +Select the appropriate metric format version below. +{{% /note %}} + +- [Normalize counter resets](#normalize-counter-resets) +- [Calculate changes between normalized counter values](#calculate-changes-between-normalized-counter-values) +- [Calculate the rate of change in normalized counter values](#calculate-the-rate-of-change-in-normalized-counter-values) + +## Normalize counter resets + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +1. Filter results by the `prometheus` measurement and **counter metric name** field. +2. Use [`increase()`](/flux/v0.x/stdlib/universe/increase/) to normalize counter resets. +`increase()` returns the cumulative sum of positive changes in column values. + +{{% note %}} +`increase()` accounts for counter resets, but may lose some precision on reset +depending on your scrape interval. +On counter reset, `increase()` assumes no increase. +{{% /note %}} + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "prometheus" and + r._field == "http_query_request_bytes" + ) + |> increase() +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-increase-input.png" alt="Raw Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-increase-output.png" alt="Increase on Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example input {id="example-input-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:00Z | prometheus | http_query_request_bytes | 4302 | +| 2021-01-01T00:00:10Z | prometheus | http_query_request_bytes | 4844 | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 5091 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 13 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 215 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 762 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 1108 | + +#### Example output {id="example-output-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:10Z | prometheus | http_query_request_bytes | 542 | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 991 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 1538 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 1884 | +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} + +{{% tab-content %}} + +1. Filter results by the **counter metric name** measurement and `counter` field. +2. Use [`increase()`](/flux/v0.x/stdlib/universe/increase/) to normalize counter resets. +`increase()` returns the cumulative sum of positive changes in column values. + +{{% note %}} +`increase()` accounts for counter resets, but may lose some precision on reset +depending on your scrape interval. +On counter reset, `increase()` assumes no increase. +{{% /note %}} + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "http_query_request_bytes" and + r._field == "counter" + ) + |> increase() +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-increase-input.png" alt="Raw Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-increase-output.png" alt="Increase on Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example input {id="example-input-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:00Z | http_query_request_bytes | counter | 4302 | +| 2021-01-01T00:00:10Z | http_query_request_bytes | counter | 4844 | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 5091 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 13 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 215 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 762 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 1108 | + +#### Example output {id="example-output-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:10Z | http_query_request_bytes | counter | 542 | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 991 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 1538 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 1884 | +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +## Calculate changes between normalized counter values +Use [`difference()`](/flux/v0.x/stdlib/universe/difference/) with +[normalized counter data](#normalize-counter-resets) to return the difference +between subsequent values. + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "prometheus" and + r._field == "http_query_request_bytes" + ) + |> increase() + |> difference() +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-normalized-input.png" alt="Raw Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-difference-output.png" alt="Normalize Prometheus counter metric to account for counter resets" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example normalized counter data {id="example-normalized-counter-data-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:10Z | prometheus | http_query_request_bytes | 542 | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 991 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 1538 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 1884 | + +#### Example difference output {id="example-difference-output-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 247 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 0 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 202 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 547 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 346 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{% tab-content %}} + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "http_query_request_bytes" and + r._field == "counter" + ) + |> increase() + |> difference() +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-normalized-input.png" alt="Raw Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-difference-output.png" alt="Normalize Prometheus counter metric to account for counter resets" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example normalized counter data {id="example-normalized-counter-data-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:10Z | http_query_request_bytes | counter | 542 | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 991 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 1538 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 1884 | + +#### Example difference output {id="example-difference-output-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 247 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 0 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 202 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 547 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 346 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +## Calculate the rate of change in normalized counter values +Use [`derivative()`](/flux/v0.x/stdlib/universe/derivative/) to calculate the rate +of change between [normalized counter values](#normalize-counter-resets). +By default, `derivative()` returns the rate of change per second. +Use the [`unit` parameter](/flux/v0.x/stdlib/universe/derivative/#unit) to +customize the rate unit. + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "prometheus" and + r._field == "http_query_request_bytes" + ) + |> increase() + |> derivative() +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-normalized-input.png" alt="Normalized Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-derivative-output.png" alt="Calculate the rate of change in Prometheus counter metric with Flux" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example normalized counter data {id="example-normalized-counter-data-2-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:10Z | prometheus | http_query_request_bytes | 542 | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 991 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 1538 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 1884 | + +#### Example derivative output {id="example-derivative-output-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 24.7 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 0.0 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 20.2 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 54.7 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 34.6 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{% tab-content %}} + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "http_query_request_bytes" and + r._field == "counter" + ) + |> increase() + |> derivative() +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-normalized-input.png" alt="Normalized Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-derivative-output.png" alt="Calculate the rate of change in Prometheus counter metric with Flux" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example normalized counter data {id="example-normalized-counter-data-1-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:10Z | http_query_request_bytes | counter | 542 | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 991 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 1538 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 1884 | + +#### Example derivative output {id="example-derivative-output-1"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 24.7 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 0.0 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 20.2 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 54.7 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 34.6 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +## Calculate the average rate of change in specified time windows +To calculate the average rate of change in [normalized counter values](#normalize-counter-resets) +in specified time windows: + +1. Import the [`experimental/aggregate` package](/flux/v0.x/stdlib/experimental/aggregate/). +2. [Normalized counter values](#normalize-counter-resets). +3. Use [`aggregate.rate()`](/flux/v0.x/stdlib/experimental/aggregate/rate/) + to calculate the average rate of change per time window. + + - Use the [`every` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#every) + to define the time window interval. + - Use the [`unit` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#unit) + to customize the rate unit.By default, `aggregate.rate()` returns the per second + (`1s`) rate of change. + - Use the [`groupColumns` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#groupcolumns) + to specify columns to group by when performing the aggregation. + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +```js +import "experimental/aggregate" + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "prometheus" and + r._field == "http_query_request_bytes" + ) + |> increase() + |> aggregate.rate(every: 15s, unit: 1s) +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-normalized-input.png" alt="Normalized Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-aggregate-rate-output.png" alt="Calculate the rate of change in Prometheus counter metrics per time window with Flux" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +{{% note %}} +`_start` and `_stop` columns have been omitted. +{{% /note %}} + +#### Example normalized counter data {id="example-normalized-counter-data-2-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :----------------------- | -----: | +| 2021-01-01T00:00:10Z | prometheus | http_query_request_bytes | 542 | +| 2021-01-01T00:00:20Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:30Z | prometheus | http_query_request_bytes | 789 | +| 2021-01-01T00:00:40Z | prometheus | http_query_request_bytes | 991 | +| 2021-01-01T00:00:50Z | prometheus | http_query_request_bytes | 1538 | +| 2021-01-01T00:01:00Z | prometheus | http_query_request_bytes | 1884 | + +#### Example aggregate.rate output {id="example-aggregaterate-output-2"} +| _time | _value | +| :------------------- | -----: | +| 2021-01-01T00:00:15Z | | +| 2021-01-01T00:01:30Z | 24.7 | +| 2021-01-01T00:01:45Z | 10.1 | +| 2021-01-01T00:01:00Z | 54.7 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{% tab-content %}} +```js +import "experimental/aggregate" + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "http_query_request_bytes" and + r._field == "counter" + ) + |> increase() + |> aggregate.rate(every: 15s, unit: 1s) +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-normalized-input.png" alt="Normalized Prometheus counter metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-counter-aggregate-rate-output.png" alt="Calculate the rate of change in Prometheus counter metrics per time window with Flux" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +{{% note %}} +`_start` and `_stop` columns have been omitted. +{{% /note %}} + +#### Example normalized counter data {id="example-normalized-counter-data-1-2"} +| _time | _measurement | _field | _value | +| :------------------- | :----------------------- | :------ | -----: | +| 2021-01-01T00:00:10Z | http_query_request_bytes | counter | 542 | +| 2021-01-01T00:00:20Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:30Z | http_query_request_bytes | counter | 789 | +| 2021-01-01T00:00:40Z | http_query_request_bytes | counter | 991 | +| 2021-01-01T00:00:50Z | http_query_request_bytes | counter | 1538 | +| 2021-01-01T00:01:00Z | http_query_request_bytes | counter | 1884 | + +#### Example aggregate.rate output {id="example-aggregaterate-output-1"} +| _time | _value | +| :------------------- | -----: | +| 2021-01-01T00:00:15Z | | +| 2021-01-01T00:01:30Z | 24.7 | +| 2021-01-01T00:01:45Z | 10.1 | +| 2021-01-01T00:01:00Z | 54.7 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{< /tabs-wrapper >}} diff --git a/content/flux/v0.x/prometheus/metric-types/gauge.md b/content/flux/v0.x/prometheus/metric-types/gauge.md new file mode 100644 index 000000000..9860d81dd --- /dev/null +++ b/content/flux/v0.x/prometheus/metric-types/gauge.md @@ -0,0 +1,315 @@ +--- +title: Work with Prometheus gauges +list_title: Gauge +description: > + Use Flux to query and transform Prometheus **gauge** metrics stored in InfluxDB. + A gauge is a metric that represents a single numerical value that can + arbitrarily go up and down. +menu: + flux_0_x: + name: Gauge + parent: Prometheus metric types +weight: 101 +related: + - https://prometheus.io/docs/concepts/metric_types/, Prometheus metric types + - /{{< latest "influxdb" >}}/reference/prometheus-metrics/ +flux/v0.x/tags: [prometheus] +--- + +Use Flux to query and transform Prometheus **gauge** metrics stored in InfluxDB. + +> A _gauge_ is a metric that represents a single numerical value that can arbitrarily go up and down. +> +> {{% cite %}}[Prometheus metric types](https://prometheus.io/docs/concepts/metric_types/#gauge){{% /cite %}} + +##### Example gauge metric in Prometheus data +```sh +# HELP example_gauge_current Current number of items as example gauge metric +# TYPE example_gauge_current gauge +example_gauge_current 128 +``` + +Generally gauge metrics can be used as they are reported and don't require any +additional processing. + +The examples below include example data collected from the **InfluxDB OSS 2.x `/metrics` endpoint** +using `prometheus.scrape()` and stored in InfluxDB. + +{{% note %}} +#### Prometheus metric parsing formats +Query structure depends on the [Prometheus metric parsing format](/{{< latest "influxdb" >}}/reference/prometheus-metrics/) +used to scrape the Prometheus metrics. +Select the appropriate metric format version below. +{{% /note %}} + +- [Calculate the rate of change in gauge values](#calculate-the-rate-of-change-in-gauge-values) +- [Calculate the average rate of change in specified time windows](#calculate-the-average-rate-of-change-in-specified-time-windows) + +## Calculate the rate of change in gauge values + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +1. Filter results by the `prometheus` measurement and **counter metric name** field. +2. Use [`derivative()`](/flux/v0.x/stdlib/universe/derivative/) to calculate the rate + of change between gauge values. + By default, `derivative()` returns the rate of change per second. + Use the [`unit` parameter](/flux/v0.x/stdlib/universe/derivative/#unit) to + customize the rate unit. + To replace negative derivatives with null values, set the + [`nonNegative` parameter](/flux/v0.x/stdlib/universe/derivative/#unit) to `true`. + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "prometheus" and + r._field == "go_goroutines" + ) + |> increase() + |> derivative(nonNegative: true) +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-input.png" alt="Raw Prometheus gauge metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-derivative-output.png" alt="Derivative of Prometheus gauge metrics in InfluxDB" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example normalized counter data +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :------------ | ------: | +| 2021-01-01T00:00:00Z | prometheus | go_goroutines | 1571.97 | +| 2021-01-01T00:00:10Z | prometheus | go_goroutines | 1577.35 | +| 2021-01-01T00:00:20Z | prometheus | go_goroutines | 1591.67 | +| 2021-01-01T00:00:30Z | prometheus | go_goroutines | 1598.85 | +| 2021-01-01T00:00:40Z | prometheus | go_goroutines | 1600.0 | +| 2021-01-01T00:00:50Z | prometheus | go_goroutines | 1598.04 | +| 2021-01-01T00:01:00Z | prometheus | go_goroutines | 1602.93 | + +#### Example difference output +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :------------ | -----------------: | +| 2021-01-01T00:00:10Z | prometheus | go_goroutines | 0.5379999999999882 | +| 2021-01-01T00:00:20Z | prometheus | go_goroutines | 1.4320000000000164 | +| 2021-01-01T00:00:30Z | prometheus | go_goroutines | 0.7179999999999837 | +| 2021-01-01T00:00:40Z | prometheus | go_goroutines | 0.1150000000000091 | +| 2021-01-01T00:00:50Z | prometheus | go_goroutines | | +| 2021-01-01T00:01:00Z | prometheus | go_goroutines | 0.48900000000001 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{% tab-content %}} + +1. Filter results by the **counter metric name** measurement and `gauge` field. +2. Use [`derivative()`](/flux/v0.x/stdlib/universe/derivative/) to calculate the rate + of change between gauge values. + By default, `derivative()` returns the rate of change per second. + Use the [`unit` parameter](/flux/v0.x/stdlib/universe/derivative/#unit) to + customize the rate unit. + To replace negative derivatives with null values, set the + [`nonNegative` parameter](/flux/v0.x/stdlib/universe/derivative/#unit) to `true`. + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "go_goroutines" and + r._field == "gauge" + ) + |> increase() + |> derivative(nonNegative: true) +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-input.png" alt="Raw Prometheus gauge metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-derivative-output.png" alt="Derivative of Prometheus gauge metrics in InfluxDB" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +#### Example gauge data +| _time | _measurement | _field | _value | +| :------------------- | :------------ | :----- | ------: | +| 2021-01-01T00:00:00Z | go_goroutines | gauge | 1571.97 | +| 2021-01-01T00:00:10Z | go_goroutines | gauge | 1577.35 | +| 2021-01-01T00:00:20Z | go_goroutines | gauge | 1591.67 | +| 2021-01-01T00:00:30Z | go_goroutines | gauge | 1598.85 | +| 2021-01-01T00:00:40Z | go_goroutines | gauge | 1600.0 | +| 2021-01-01T00:00:50Z | go_goroutines | gauge | 1598.04 | +| 2021-01-01T00:01:00Z | go_goroutines | gauge | 1602.93 | + +#### Example difference output +| _time | _measurement | _field | _value | +| :------------------- | :------------ | :----- | -----------------: | +| 2021-01-01T00:00:10Z | go_goroutines | gauge | 0.5379999999999882 | +| 2021-01-01T00:00:20Z | go_goroutines | gauge | 1.4320000000000164 | +| 2021-01-01T00:00:30Z | go_goroutines | gauge | 0.7179999999999837 | +| 2021-01-01T00:00:40Z | go_goroutines | gauge | 0.1150000000000091 | +| 2021-01-01T00:00:50Z | go_goroutines | gauge | | +| 2021-01-01T00:01:00Z | go_goroutines | gauge | 0.48900000000001 | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +## Calculate the average rate of change in specified time windows + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +1. Import the [`experimental/aggregate` package](/flux/v0.x/stdlib/experimental/aggregate/). +2. Filter results by the `prometheus` measurement and **counter metric name** field. +3. Use [`aggregate.rate()`](/flux/v0.x/stdlib/experimental/aggregate/rate/) + to calculate the average rate of change per time window. + + - Use the [`every` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#every) + to define the time window interval. + - Use the [`unit` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#unit) + to customize the rate unit. By default, `aggregate.rate()` returns the per second + (`1s`) rate of change. + - Use the [`groupColumns` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#groupcolumns) + to specify columns to group by when performing the aggregation. + +```js +import "experimental/aggregate" + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "prometheus" and + r._field == "go_goroutines" + ) + |> aggregate.rate(every: 10s, unit: 1s) +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-input.png" alt="Raw Prometheus gauge metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png" alt="Calculate the average rate of change of Prometheus gauge metrics per time window with Flux" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +{{% note %}} +`_start` and `_stop` columns have been omitted. +{{% /note %}} + +#### Example gauge data +| _time | _measurement | _field | _value | +| :------------------- | :----------- | :------------ | ------: | +| 2021-01-01T00:00:00Z | prometheus | go_goroutines | 1571.97 | +| 2021-01-01T00:00:10Z | prometheus | go_goroutines | 1577.35 | +| 2021-01-01T00:00:20Z | prometheus | go_goroutines | 1591.67 | +| 2021-01-01T00:00:30Z | prometheus | go_goroutines | 1598.85 | +| 2021-01-01T00:00:40Z | prometheus | go_goroutines | 1600.0 | +| 2021-01-01T00:00:50Z | prometheus | go_goroutines | 1598.04 | +| 2021-01-01T00:01:00Z | prometheus | go_goroutines | 1602.93 | + +#### Example aggregate.rate output + +| _time | _value | +| :------------------- | -----------------: | +| 2021-01-01T00:00:10Z | | +| 2021-01-01T00:00:20Z | 0.5379999999999882 | +| 2021-01-01T00:00:30Z | 1.4320000000000164 | +| 2021-01-01T00:00:40Z | 0.7179999999999837 | +| 2021-01-01T00:00:50Z | 0.1150000000000091 | +| 2021-01-01T00:01:00Z | | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{% tab-content %}} + +1. Import the [`experimental/aggregate` package](/flux/v0.x/stdlib/experimental/aggregate/). +2. Filter results by the **counter metric name** measurement and `gauge` field. +3. Use [`aggregate.rate()`](/flux/v0.x/stdlib/experimental/aggregate/rate/) + to calculate the average rate of change per time window. + + - Use the [`every` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#every) + to define the time window interval. + - Use the [`unit` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#unit) + to customize the rate unit. By default, `aggregate.rate()` returns the per second + (`1s`) rate of change. + - Use the [`groupColumns` parameter](/flux/v0.x/stdlib/experimental/aggregate/rate/#groupcolumns) + to specify columns to group by when performing the aggregation. + +```js +import "experimental/aggregate" + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => + r._measurement == "go_goroutines" and + r._field == "gauge" + ) + |> aggregate.rate(every: 10s, unit: 1s) +``` + +{{< flex >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-input.png" alt="Raw Prometheus gauge metric in InfluxDB" />}} +{{< /flex-content >}} +{{< flex-content >}} +{{< img-hd src="/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png" alt="Calculate the average rate of change of Prometheus gauge metrics per time window with Flux" />}} +{{< /flex-content >}} +{{< /flex >}} + +{{< expand-wrapper >}} +{{% expand "View example input and output data" %}} + +{{% note %}} +`_start` and `_stop` columns have been omitted. +{{% /note %}} + +#### Example normalized counter data {id="example-normalized-counter-data-2"} +| _time | _measurement | _field | _value | +| :------------------- | :------------ | :----- | ------: | +| 2021-01-01T00:00:00Z | go_goroutines | gauge | 1571.97 | +| 2021-01-01T00:00:10Z | go_goroutines | gauge | 1577.35 | +| 2021-01-01T00:00:20Z | go_goroutines | gauge | 1591.67 | +| 2021-01-01T00:00:30Z | go_goroutines | gauge | 1598.85 | +| 2021-01-01T00:00:40Z | go_goroutines | gauge | 1600.0 | +| 2021-01-01T00:00:50Z | go_goroutines | gauge | 1598.04 | +| 2021-01-01T00:01:00Z | go_goroutines | gauge | 1602.93 | + +#### Example aggregate.rate output +| _time | _value | +| :------------------- | -----------------: | +| 2021-01-01T00:00:10Z | | +| 2021-01-01T00:00:20Z | 0.5379999999999882 | +| 2021-01-01T00:00:30Z | 1.4320000000000164 | +| 2021-01-01T00:00:40Z | 0.7179999999999837 | +| 2021-01-01T00:00:50Z | 0.1150000000000091 | +| 2021-01-01T00:01:00Z | | + +{{% /expand %}} +{{< /expand-wrapper >}} +{{% /tab-content %}} +{{< /tabs-wrapper >}} diff --git a/content/flux/v0.x/prometheus/metric-types/histogram.md b/content/flux/v0.x/prometheus/metric-types/histogram.md new file mode 100644 index 000000000..2394ebc15 --- /dev/null +++ b/content/flux/v0.x/prometheus/metric-types/histogram.md @@ -0,0 +1,171 @@ +--- +title: Work with Prometheus histograms +list_title: Histogram +description: > + Use Flux to query and transform Prometheus **histogram** metrics stored in InfluxDB. + A histogram samples observations (usually things like request durations or + response sizes) and counts them in configurable buckets. + It also provides a sum of all observed values. +menu: + flux_0_x: + name: Histogram + parent: Prometheus metric types +weight: 101 +flux/v0.x/tags: [prometheus] +related: + - https://prometheus.io/docs/concepts/metric_types/, Prometheus metric types + - /{{< latest "influxdb" >}}/reference/prometheus-metrics/ + - /flux/v0.x/stdlib/experimental/prometheus/histogramQuantile/ +--- + +Use Flux to query and transform Prometheus **histogram** metrics stored in InfluxDB. + +> A _histogram_ samples observations (usually things like request durations or +> response sizes) and counts them in configurable buckets. +> It also provides a sum of all observed values. +> +> {{% cite %}}[Prometheus metric types](https://prometheus.io/docs/concepts/metric_types/#histogram){{% /cite %}} + +##### Example histogram metric in Prometheus data +```sh +# HELP example_histogram_duration Duration of given tasks as example histogram metric +# TYPE example_histogram_duration histogram +example_histogram_duration_bucket{le="0.1"} 80 +example_histogram_duration_bucket{le="0.25"} 85 +example_histogram_duration_bucket{le="0.5"} 85 +example_histogram_duration_bucket{le="1"} 87 +example_histogram_duration_bucket{le="2.5"} 87 +example_histogram_duration_bucket{le="5"} 88 +example_histogram_duration_bucket{le="+Inf"} 88 +example_histogram_duration_sum 6.833441910000001 +example_histogram_duration_count 88 +``` + +The examples below include example data collected from the **InfluxDB OSS 2.x `/metrics` endpoint** +and stored in InfluxDB. + +{{% note %}} +#### Prometheus metric parsing formats +Query structure depends on the [Prometheus metric parsing format](/{{< latest "influxdb" >}}/reference/prometheus-metrics/) +used to scrape the Prometheus metrics. +Select the appropriate metric format version below. +{{% /note %}} + +- [Calculate quantile values from Prometheus histograms](#calculate-quantile-values-from-prometheus-histograms) +- [Calculate multiple quantiles from Prometheus histograms](#calculate-multiple-quantiles-from-prometheus-histograms) + +## Visualize Prometheus histograms in InfluxDB +_InfluxDB does not currently support visualizing Prometheus histogram metrics +as a traditional histogram. The existing [InfluxDB histogram visualization](/influxdb/cloud/visualize-data/visualization-types/histogram/) +is **not compatible** with the format of Prometheus histogram data stored in InfluxDB._ + +## Calculate quantile values from Prometheus histograms + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} +1. Import the [`experimental/prometheus` package](/flux/v0.x/stdlib/experimental/prometheus/). +2. Filter results by the `prometheus` measurement and **histogram metric name** field. +3. _(Recommended)_ Use [`aggregateWindow()`](/flux/v0.x/stdlib/universe/aggregatewindow/) + to downsample data and optimize the query. +4. Use [`prometheus.histogramQuantile()`](/flux/v0.x/stdlib/experimental/prometheus/histogramQuantile/) + to calculate a specific quantile. + +```js +import "experimental/prometheus" + +from(bucket: "example-bucket") + |> start(range: -1h) + |> filter(fn: (r) => r._measurement == "prometheus") + |> filter(fn: (r) => r._field == "qc_all_duration_seconds") + |> aggregateWindow(every: 1m, fn: mean, createEmpty: false) + |> prometheus.histogramQuantile(quantile: 0.99) +``` +{{% /tab-content %}} + +{{% tab-content %}} +1. Import the [`experimental/prometheus` package](/flux/v0.x/stdlib/experimental/prometheus/). +2. Filter results by the **histogram metric name** measurement. +3. _(Recommended)_ Use [`aggregateWindow()`](/flux/v0.x/stdlib/universe/aggregatewindow/) + to downsample data and optimize the query. + **Set the `createEmpty` parameter to `false`.** +4. Use [`prometheus.histogramQuantile()`](/flux/v0.x/stdlib/experimental/prometheus/histogramQuantile) + to calculate a specific quantile. Specify the `metricVersion` as `1`. + +```js +import "experimental/prometheus" + +from(bucket: "example-bucket") + |> start(range: -1h) + |> filter(fn: (r) => r._measurement == "qc_all_duration_seconds") + |> aggregateWindow(every: 1m, fn: mean, createEmpty: false) + |> prometheus.histogramQuantile(quantile: 0.99, metricVersion: 1) +``` +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +{{< img-hd src="/img/flux/0-x-prometheus-histogram-quantile.png" alt="Calculate a quantile from Prometheus histogram metrics" />}} + +{{% note %}} +#### Set createEmpty to false +When using `aggregateWindow()` to downsample data for `prometheus.histogramQuantile`, +**set the `createEmpty` parameter to `false`**. +Empty tables produced from `aggregateWindow()` result in the following error. + +``` +histogramQuantile: unexpected null in the countColumn +``` +{{% /note %}} + +## Calculate multiple quantiles from Prometheus histograms + +1. Query histogram data using [steps 1-2 (optionally 3) from above](#calculate-quantiles-from-prometheus-histograms). +2. Use [`union()`](/flux/v0.x/stdlib/universe/union/) to union multiple + streams of tables that calculate unique quantiles. + +{{< code-tabs-wrapper >}} +{{% code-tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /code-tabs %}} +{{% code-tab-content %}} +```js +import "experimental/prometheus" + +data = from(bucket: "example-bucket") + |> start(range: -1h) + |> filter(fn: (r) => r._measurement == "prometheus") + |> filter(fn: (r) => r._field == "qc_all_duration_seconds") + |> aggregateWindow(every: 1m, fn: mean, createEmpty: false) + +union(tables: [ + data |> prometheus.histogramQuantile(quantile: 0.99), + data |> prometheus.histogramQuantile(quantile: 0.5), + data |> prometheus.histogramQuantile(quantile: 0.25) +]) +``` +{{% /code-tab-content %}} + +{{% code-tab-content %}} +```js +import "experimental/prometheus" + +data = from(bucket: "example-bucket") + |> start(range: -1h) + |> filter(fn: (r) => r._measurement == "qc_all_duration_seconds") + |> aggregateWindow(every: 1m, fn: mean, createEmpty: false) + +union(tables: [ + data |> prometheus.histogramQuantile(quantile: 0.99, metricVersion: 1), + data |> prometheus.histogramQuantile(quantile: 0.5, metricVersion: 1), + data |> prometheus.histogramQuantile(quantile: 0.25, metricVersion: 1) +]) + +``` +{{% /code-tab-content %}} +{{< /code-tabs-wrapper >}} + +{{< img-hd src="/img/flux/0-x-prometheus-histogram-multiple-quantiles.png" alt="Calculate multiple quantiles from Prometheus histogram metrics" />}} diff --git a/content/flux/v0.x/prometheus/metric-types/summary.md b/content/flux/v0.x/prometheus/metric-types/summary.md new file mode 100644 index 000000000..857d828c5 --- /dev/null +++ b/content/flux/v0.x/prometheus/metric-types/summary.md @@ -0,0 +1,138 @@ +--- +title: Work with Prometheus summaries +list_title: Summary +description: > + Use Flux to query and transform Prometheus **summary** metrics stored in InfluxDB. + A summary samples observations, e.g. request durations and response sizes. + While it also provides a total count of observations and a sum of all observed + values, it calculates configurable quantiles over a sliding time window. +menu: + flux_0_x: + name: Summary + parent: Prometheus metric types +weight: 101 +flux/v0.x/tags: [prometheus] +related: + - https://prometheus.io/docs/concepts/metric_types/, Prometheus metric types + - /{{< latest "influxdb" >}}/reference/prometheus-metrics/ +--- + +Use Flux to query and transform Prometheus **summary** metrics stored in InfluxDB. + +> A _summary_ samples observations (usually things like request durations and response sizes). +> While it also provides a total count of observations and a sum of all observed +> values, it calculates configurable quantiles over a sliding time window. +> +> {{% cite %}}[Prometheus metric types](https://prometheus.io/docs/concepts/metric_types/#summary){{% /cite %}} + +##### Example summary metric in Prometheus data +```sh +# HELP task_executor_run_duration The duration in seconds between a run starting and finishing. +# TYPE task_executor_run_duration summary +example_summary_duration{label="foo",quantile="0.5"} 4.147907251 +example_summary_duration{label="foo",quantile="0.9"} 4.147907251 +example_summary_duration{label="foo",quantile="0.99"} 4.147907251 +example_summary_duration_sum{label="foo"} 2701.367126714001 +example_summary_duration_count{label="foo"} 539 +``` + +The examples below include example data collected from the **InfluxDB OSS 2.x `/metrics` endpoint** +and stored in InfluxDB. + +{{% note %}} +#### Prometheus metric parsing formats +Query structure depends on the [Prometheus metric parsing format](/{{< latest "influxdb" >}}/reference/prometheus-metrics/) +used to scrape the Prometheus metrics. +Select the appropriate metric format version below. +{{% /note %}} + +- [Visualize summary metric quantile values](#visualize-summary-metric-quantile-values) +- [Derive average values from a summary metric](#derive-average-values-from-a-summary-metric) + +## Visualize summary metric quantile values +Prometheus summary metrics provide quantile values that can be visualized without modification. + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +1. Filter by the `prometheus` measurement. +2. Filter by your **Prometheus metric name** field. + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "prometheus") + |> filter(fn: (r) => r._field == "go_gc_duration_seconds") +``` +{{% /tab-content %}} +{{% tab-content %}} + +1. Filter by your **Prometheus metric name** measurement. +2. Filter out the `sum` and `count` fields. + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "go_gc_duration_seconds") + |> filter(fn: (r) => r._field != "count" and r._field != "sum") +``` +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +{{< img-hd src="/img/flux/0-x-prometheus-summary-quantiles.png" alt="Visualize Prometheus summary quantiles" />}} + +## Derive average values from a summary metric +Use the **sum** and **count** values provided in Prometheus summary metrics to +derive an average summary value. + +{{< tabs-wrapper >}} +{{% tabs "small" %}} +[Metric version 2](#) +[Metric version 1](#) +{{% /tabs %}} +{{% tab-content %}} + +1. Filter by the `prometheus` measurement. +2. Filter by the `<metric_name>_count` and `<metric_name>_sum` fields. +3. Use [`pivot()`](/flux/v0.x/stdlib/universe/pivot/) to pivot fields into + columns based on time. Each row then contains a `<metric_name>_count` and + `<metric_name>_sum` column. +4. Divide the `<metric_name>_sum` column by the `<metric_name>_count` column to + produce a new `_value`. + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "prometheus") + |> filter(fn: (r) => + r._field == "go_gc_duration_seconds_count" or + r._field == "go_gc_duration_seconds_sum" + ) + |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") + |> map(fn: (r) => ({ r with + _value: r.go_gc_duration_seconds_sum / r.go_gc_duration_seconds_count + })) +``` +{{% /tab-content %}} +{{% tab-content %}} + +1. Filter by your **Prometheus metric name** measurement. +2. Filter by the `count` and `sum` fields. +3. Use [`pivot()`](/flux/v0.x/stdlib/universe/pivot/) to pivot fields into columns. + Each row then contains a `count` and `sum` column. +4. Divide the `sum` column by the `count` column to produce a new `_value`. + +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "go_gc_duration_seconds") + |> filter(fn: (r) => r._field == "count" or r._field == "sum") + |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") + |> map(fn: (r) => ({ r with _value: r.sum / r.count })) +``` +{{% /tab-content %}} +{{< /tabs-wrapper >}} \ No newline at end of file diff --git a/content/flux/v0.x/prometheus/scrape-prometheus.md b/content/flux/v0.x/prometheus/scrape-prometheus.md new file mode 100644 index 000000000..40d5722c1 --- /dev/null +++ b/content/flux/v0.x/prometheus/scrape-prometheus.md @@ -0,0 +1,193 @@ +--- +title: Scrape Prometheus metrics +description: > + Use the Flux [`prometheus.scrape`](/flux/v0.x/stdlib/experimental/prometheus/scrape/) function to + scrape Prometheus-formatted metrics from an HTTP-accessible endpoint. +menu: + flux_0_x: + parent: Work with Prometheus +weight: 101 +flux/v0.x/tags: [prometheus] +related: + - https://prometheus.io/docs/concepts/data_model/, Prometheus data model + - /flux/v0.x/stdlib/experimental/prometheus/scrape/ + - /influxdb/cloud/process-data/manage-tasks/create-task/, Create an InfluxDB task + - /{{< latest "influxdb" >}}/reference/prometheus-metrics/, InfluxDB Prometheus metric parsing formats + - /influxdb/cloud/write-data/developer-tools/scrape-prometheus-metrics, Scrape Prometheus metrics with InfluxDB Cloud + - /{{< latest "influxdb" >}}/write-data/developer-tools/scrape-prometheus-metrics, Scrape Prometheus metrics with InfluxDB OSS +--- + +To use Flux to scrape [Prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/) +from an HTTP-accessible endpoint: + +1. Import the [`experimental/prometheus` package](/flux/v0.x/stdlib/experimental/prometheus/). +2. Use [`prometheus.scrape`](/flux/v0.x/stdlib/experimental/prometheus/scrape/) and + specify the **url** to scrape metrics from. + +{{< keep-url >}} +```js +import "experimental/prometheus" + +prometheus.scrape(url: "http://localhost:8086/metrics") +``` + +## Output structure +`prometheus.scrape()` returns a [stream of tables](/flux/v0.x/get-started/data-model/#stream-of-tables) +with the following columns: + +- **_time**: Data timestamp +- **_measurement**: `prometheus` +- **_field**: [Prometheus metric name](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) + _(`_bucket` is trimmed from histogram metric names)_ +- **_value**: [Prometheus metric value](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) +- **url**: URL metrics were scraped from +- **Label columns**: A column for each [Prometheus label](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). + The column label is the label name and the column value is the label value. + +Tables are grouped by **_measurement**, **_field**, and **Label columns**. + +{{% note %}} +#### Columns with the underscore prefix +Columns with the underscore (`_`) prefix are considered "system" columns. +Some Flux functions require these columns to function properly. +{{% /note %}} + +### Example Prometheus query results +The following are example Prometheus metrics scraped from the **InfluxDB OSS 2.x `/metrics`** endpoint: + +```sh +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 1.42276424e+09 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 5.259247e+06 +# HELP task_executor_run_latency_seconds Records the latency between the time the run was due to run and the time the task started execution, by task type +# TYPE task_executor_run_latency_seconds histogram +task_executor_run_latency_seconds_bucket{task_type="system",le="0.25"} 4413 +task_executor_run_latency_seconds_bucket{task_type="system",le="0.5"} 11901 +task_executor_run_latency_seconds_bucket{task_type="system",le="1"} 12565 +task_executor_run_latency_seconds_bucket{task_type="system",le="2.5"} 12823 +task_executor_run_latency_seconds_bucket{task_type="system",le="5"} 12844 +task_executor_run_latency_seconds_bucket{task_type="system",le="10"} 12864 +task_executor_run_latency_seconds_bucket{task_type="system",le="+Inf"} 74429 +task_executor_run_latency_seconds_sum{task_type="system"} 4.256783538679698e+11 +task_executor_run_latency_seconds_count{task_type="system"} 74429 +# HELP task_executor_run_duration The duration in seconds between a run starting and finishing. +# TYPE task_executor_run_duration summary +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.5"} 5.178160855 +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.9"} 5.178160855 +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.99"} 5.178160855 +task_executor_run_duration_sum{taskID="00xx0Xx0xx00XX0x0",task_type="threshold"} 2121.9758301650004 +task_executor_run_duration_count{taskID="00xx0Xx0xx00XX0x0",task_type="threshold"} 570 +``` + +When scraped by Flux, these metrics return the following stream of tables: + +| _time | _measurement | url | _field | _value | +| :------------------------ | :----------- | :---------------------------- | :---------------------------- | -----------: | +| {{< flux/current-time >}} | prometheus | http://localhost:8086/metrics | go_memstats_alloc_bytes_total | 1422764240.0 | + +| _time | _measurement | url | _field | _value | +| :------------------------ | :----------- | :---------------------------- | :------------------------------ | --------: | +| {{< flux/current-time >}} | prometheus | http://localhost:8086/metrics | go_memstats_buck_hash_sys_bytes | 5259247.0 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :--- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 0.25 | task_executor_run_latency_seconds | 4413 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 0.5 | task_executor_run_latency_seconds | 11901 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 1 | task_executor_run_latency_seconds | 12565 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 2.5 | task_executor_run_latency_seconds | 12823 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 5 | task_executor_run_latency_seconds | 12844 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :--- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | +Inf | task_executor_run_latency_seconds | 74429 | + +| _time | _measurement | task_type | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :------------------------------------ | ----------------: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | task_executor_run_latency_seconds_sum | 425678353867.9698 | + +| _time | _measurement | task_type | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-------------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | task_executor_run_latency_seconds_count | 74429 | + +| _time | _measurement | task_type | taskID | url | quantile | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------- | :------------------------- | ----------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | 0.5 | task_executor_run_duration | 5.178160855 | + +| _time | _measurement | task_type | taskID | url | quantile | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------- | :------------------------- | ----------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | 0.9 | task_executor_run_duration | 5.178160855 | + +| _time | _measurement | task_type | taskID | url | quantile | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------- | :------------------------- | ----------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | 0.99 | task_executor_run_duration | 5.178160855 | + +| _time | _measurement | task_type | taskID | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :----------------------------- | -----------------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | task_executor_run_duration_sum | 2121.9758301650004 | + +| _time | _measurement | task_type | taskID | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | task_executor_run_duration_count | 570 | + +{{% note %}} +#### Different data structures for scraped Prometheus metrics +[Telegraf](/{{< latest "telegraf" >}}/) and [InfluxDB](/{{< latest "influxdb" >}}/) +provide tools that scrape Prometheus metrics and store them in InfluxDB. +Depending on the tool and and configuration you use to scrape metrics, +the resulting data structure may differ from the structure returned by `prometheus.scrape()` +described [above](#output-structure). + +For information about the different data structures of scraped Prometheus metrics +stored in InfluxDB, see [InfluxDB Prometheus metric parsing formats](/{{< latest "influxdb" >}}/reference/prometheus-metrics/). +{{% /note %}} + +## Write Prometheus metrics to InfluxDB +To write scraped Prometheus metrics to InfluxDB: + +1. Use [`prometheus.scrape`](/flux/v0.x/stdlib/experimental/prometheus/scrape) + to scrape Prometheus metrics. +2. Use [`to()`](/flux/v0.x/stdlib/influxdata/influxdb/to/) to write the scraped + metrics to InfluxDB. + +```js +import "experimental/prometheus" + +prometheus.scrape(url: "http://example.com/metrics") + |> to( + bucket: "example-bucket", + host: "http://localhost:8086", + org: "example-org", + token: "mYsuP3R5eCR37t0K3n" + ) +``` + +### Write Prometheus metrics to InfluxDB at regular intervals +To scrape Prometheus metrics and write them to InfluxDB at regular intervals, +scrape Prometheus metrics in an [InfluxDB task](/influxdb/cloud/process-data/get-started/). + +```js +import "experimental/prometheus" + +option task = { + name: "Scrape Prometheus metrics", + every: 10s +} + +prometheus.scrape(url: "http://example.com/metrics") + |> to(bucket: "example-bucket") +``` diff --git a/content/flux/v0.x/stdlib/experimental/prometheus/scrape.md b/content/flux/v0.x/stdlib/experimental/prometheus/scrape.md index cf3a70818..5db0dddb4 100644 --- a/content/flux/v0.x/stdlib/experimental/prometheus/scrape.md +++ b/content/flux/v0.x/stdlib/experimental/prometheus/scrape.md @@ -21,6 +21,7 @@ The `prometheus.scrape()` function retrieves [Prometheus-formatted metrics](http from a specified URL. The function groups metrics (including histogram and summary values) into individual tables. +{{< keep-url >}} ```js import "experimental/prometheus" diff --git a/content/influxdb/cloud/query-data/flux/histograms.md b/content/influxdb/cloud/query-data/flux/histograms.md index 004f4e816..fb0f07b80 100644 --- a/content/influxdb/cloud/query-data/flux/histograms.md +++ b/content/influxdb/cloud/query-data/flux/histograms.md @@ -12,6 +12,7 @@ menu: weight: 210 related: - /{{< latest "flux" >}}/stdlib/universe/histogram + - /{{< latest "flux" >}}/prometheus/metric-types/histogram/, Work with Prometheus histograms in Flux list_query_example: histogram --- diff --git a/content/influxdb/cloud/reference/prometheus-metrics.md b/content/influxdb/cloud/reference/prometheus-metrics.md new file mode 100644 index 000000000..3449e0f9a --- /dev/null +++ b/content/influxdb/cloud/reference/prometheus-metrics.md @@ -0,0 +1,19 @@ +--- +title: Prometheus metric parsing formats +description: > + When scraping [Prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/) + and writing them to InfluxDB Cloud, metrics are parsed and stored in InfluxDB in different formats. +menu: + influxdb_cloud_ref: + name: Prometheus metrics +weight: 8 +influxdb/v2.0/tags: [prometheus] +related: + - https://prometheus.io/docs/concepts/data_model/, Prometheus data model + - /influxdb/cloud/write-data/developer-tools/scrape-prometheus-metrics/ + - /{{< latest "flux" >}}/prometheus/, Work with Prometheus in Flux + - /{{< latest "telegraf" >}}/plugins/#prometheus, Telegraf Prometheus input plugin + - /{{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/ +--- + +{{< duplicate-oss >}} \ No newline at end of file diff --git a/content/influxdb/cloud/write-data/developer-tools/scrape-prometheus-metrics.md b/content/influxdb/cloud/write-data/developer-tools/scrape-prometheus-metrics.md new file mode 100644 index 000000000..c34ce2527 --- /dev/null +++ b/content/influxdb/cloud/write-data/developer-tools/scrape-prometheus-metrics.md @@ -0,0 +1,20 @@ +--- +title: Scrape Prometheus metrics +seotitle: Scape Prometheus metrics into InfluxDB +weight: 205 +description: > + Use Telegraf or Flux to scrape Prometheus-formatted metrics + from an HTTP-accessible endpoint and store them in InfluxDB. +menu: + influxdb_cloud: + name: Scrape Prometheus metrics + parent: Developer tools +related: + - /{{< latest "telegraf" >}}/plugins/#prometheus, Telegraf Prometheus input plugin + - /{{< latest "flux" >}}/prometheus/scrape-prometheus/ + - /{{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/ + - /{{< latest "flux" >}}/prometheus/metric-types/ +influxdb/v2.0/tags: [prometheus] +--- + +{{< duplicate-oss >}} \ No newline at end of file diff --git a/content/influxdb/v2.0/query-data/flux/histograms.md b/content/influxdb/v2.0/query-data/flux/histograms.md index 776206e12..c39c66bbb 100644 --- a/content/influxdb/v2.0/query-data/flux/histograms.md +++ b/content/influxdb/v2.0/query-data/flux/histograms.md @@ -13,6 +13,7 @@ aliases: - /influxdb/v2.0/query-data/guides/histograms/ related: - /{{< latest "flux" >}}/stdlib/universe/histogram + - /{{< latest "flux" >}}/prometheus/metric-types/histogram/, Work with Prometheus histograms in Flux list_query_example: histogram --- @@ -192,124 +193,5 @@ and `severity` as the **Group By** option: ### Use Prometheus histograms in Flux -Use InfluxDB and Telegraf to monitor a service instrumented with an endpoint that outputs [prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/). This example demonstrates how to use Telegraf to scrape metrics from the InfluxDB 2.0 OSS `/metrics` endpoint at regular intervals (10s by default), and then store those metrics in InfluxDB. - -Use Prometheus histograms to measure the distribution of a variable, for example, the time it takes a server to respond to a request. Prometheus represents histograms as many sets of buckets (notably, different from an InfluxDB bucket). -Each unique set of labels corresponds to one set of buckets; within that set, each bucket is labeled with an upper bound. -In this example, the upper bound label is `le`, which stands for *less than or equal to*. -In the example `/metrics` endpoint output below, there is a bucket for requests that take less-than-or-equal-to 0.005s, 0.01s, and so on, up to 10s and then +Inf. Note that the buckets are cumulative, so if a request takes 7.5s, Prometheus increments the counters in the buckets for 10s as well as +Inf. - -{{< expand-wrapper >}} -{{% expand "View sample histogram data from the /metrics endpoint" %}} -Sample histogram metrics from the `/metrics` endpoint on an instance of InfluxDB OSS 2.0, including two histograms for requests served by the `/api/v2/write` and `/api/v2/query` endpoints. - -```js -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.005"} 0 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.01"} 1 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.025"} 13 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.05"} 14 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.1"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.25"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="0.5"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="1"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="2.5"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="5"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="10"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf",le="+Inf"} 16 -http_api_request_duration_seconds_sum{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf"} 0.354163124 -http_api_request_duration_seconds_count{handler="platform",method="POST",path="/api/v2/write",response_code="204",status="2XX",user_agent="Telegraf"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.005"} 0 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.01"} 16 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.025"} 68 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.05"} 70 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.1"} 70 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.25"} 70 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="0.5"} 70 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="1"} 71 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="2.5"} 71 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="5"} 71 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="10"} 71 -http_api_request_duration_seconds_bucket{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome",le="+Inf"} 71 -http_api_request_duration_seconds_sum{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome"} 1.4840353630000003 -http_api_request_duration_seconds_count{handler="platform",method="POST",path="/api/v2/query",response_code="200",status="2XX",user_agent="Chrome"} 71 -``` -{{% /expand %}} -{{< /expand-wrapper >}} - -Use the [histogramQuantile()](/{{< latest "flux" >}}/stdlib/universe/histogramquantile/) function to convert a Prometheus histogram to a specified quantile. -This function expects a stream of input tables where each table has the following form: - -- Each row represents one bucket of a histogram, where the upper bound of the bucket is defined by the -argument `upperBoundColumn` (by default, `le`). -- A value column represents the number of items (requests, events, etc.) in the bucket (by default, `_value`). -- Buckets are strictly cumulative, so for example, if for some reason the `+Inf` bucket had a count of `9`, -but the `10s` bucket had a count of 10, the following error would occur: "histogram records counts are not monotonic". -Given Prometheus increments the counts in each bucket continually as the process runs, whatever is most recently scraped from `/metrics` is a histogram of all the requests (events, etc) since the process started (maybe days, weeks, or longer). To be more useful, Telegraf scrapes at regular intervals, and we can subtract adjacent samples from the same bucket to discover the number of new items in that bucket for a given interval. - -To transform a set of cumulative histograms collected over time and visualize that as some quantile (such as the 50th percentile or 99th percentile) and show change over time, complete the following high-level transformations: - -1. Use `aggregateWindow()` to downsample the data to a specified time resolution to improve query performance. For example, to see how the 50th percentile changes over a month, downsample to a resolution of `1h`. - - ```js - // ... - |> aggregateWindow(every: 1h, fn: last) - ``` -2. Use `difference()` to subtract adjacent samples so that buckets contain only the new counts for each period. -3. Sum data across the dimensions that we aren't interested in. For example, in the Prometheus data from above, there is a label for path, but we may not care to break out http requests by path. If this is the case, we would ungroup the path dimension, and then add corresponding buckets together. -4. Reshape the data so all duration buckets for the same period are in their own tables, with an upper bound column that describes the bucket represented by each row. -5. Transform each table from a histogram to a quantile with the `histogramQuantile()` function. - -The following query performs the above steps. - -```js -import "experimental" - -// The "_field" is necessary. Any columns following "_field" will be used -// to create quantiles for each unique value in that column. -// E.g., put "path" in here to see quantiles for each unique value of "path". -groupCols = ["_field"] - -// This is a helper function that takes a stream of tables, -// each containing "le" buckets for one window period. -// It uses histogramQuantile to transform the bin counts -// to a quantile defined in the "q" parameter. -// The windows are then reassembled to produce a single table for each -// unique group key. -doQuantile = (tables=<-, q) => tables - |> histogramQuantile(quantile: q) - |> duplicate(as: "_time", column: "_stop") - |> window(every: inf) - |> map(fn: (r) => ({r with _measurement: "quantile", _field: string(v: q)})) - |> experimental.group(mode: "extend", columns: ["_measurement", "_field"]) - -histograms = - from(bucket: "telegraf") - |> range(start: v.timeRangeStart, stop: v.timeRangeStop) - |> filter(fn: (r) => r._measurement == "http_api_request_duration_seconds" - and r._field != "count" and r._field != "sum") - // Downsample the data. This helps a lot with performance! - |> aggregateWindow(fn: last, every: v.windowPeriod) - // Calling difference() transforms the cumulative count of requests - // to the number of new requests per window period. - |> difference(nonNegative: true) - // Counters may be reset when a server restarts. - // When this happens there will be null values produced by difference(). - |> filter(fn: (r) => exists r._value) - // Group data on the requested dimensions, window it, and sum within those dimensions, for each window. - |> group(columns: groupCols) - |> window(every: v.windowPeriod) - |> sum() - // Fields will have names like "0.001", etc. Change _field to a float column called "le". - // This also has the effect of ungrouping by _field, so bucket counts for each period - // will be within the same table. - |> map(fn: (r) => ({r with le: float(v: r._field)})) - |> drop(columns: ["_field"]) - -// Compute the 50th and 95th percentile for duration of http requests. -union(tables: [ - histograms |> doQuantile(q: 0.95), - histograms |> doQuantile(q: 0.5) -]) -``` - -The tables piped-forward into `histogramQuantile()` should look similar to those returned by the `histograms` variable in the example above. Note, that rows are sorted by `le` to be clear that the counts increase for larger upper bounds. +_For information about working with Prometheus histograms in Flux, see +[Work with Prometheus histograms](/{{< latest "flux" >}}/prometheus/metric-types/histogram/)._ \ No newline at end of file diff --git a/content/influxdb/v2.0/reference/glossary.md b/content/influxdb/v2.0/reference/glossary.md index 2a42c4816..297e06dc3 100644 --- a/content/influxdb/v2.0/reference/glossary.md +++ b/content/influxdb/v2.0/reference/glossary.md @@ -2,7 +2,7 @@ title: Glossary description: > Terms related to InfluxData products and platforms. -weight: 8 +weight: 9 menu: influxdb_2_0_ref: name: Glossary diff --git a/content/influxdb/v2.0/reference/prometheus-metrics.md b/content/influxdb/v2.0/reference/prometheus-metrics.md new file mode 100644 index 000000000..aefd422a0 --- /dev/null +++ b/content/influxdb/v2.0/reference/prometheus-metrics.md @@ -0,0 +1,286 @@ +--- +title: Prometheus metric parsing formats +description: > + When scraping [Prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/) + and writing them to InfluxDB, metrics are parsed and stored in InfluxDB in different formats. +menu: + influxdb_2_0_ref: + name: Prometheus metrics +weight: 8 +influxdb/v2.0/tags: [prometheus] +related: + - https://prometheus.io/docs/concepts/data_model/, Prometheus data model + - /influxdb/v2.0/write-data/developer-tools/scrape-prometheus-metrics/ + - /{{< latest "flux" >}}/prometheus/, Work with Prometheus in Flux + - /{{< latest "telegraf" >}}/plugins/#prometheus, Telegraf Prometheus input plugin + - /influxdb/v2.0/write-data/no-code/scrape-data/ + - /{{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/ +--- + +[Prometheus-formatted metrics](https://prometheus.io/docs/concepts/data_model/) +are parsed and written to InfluxDB in one of two formats, depending on the scraping tool used: + +- [Metric version 1](#metric-version-1) +- [Metric version 2](#metric-version-2) + +#### Scraping tools and parsing format +{{% oss-only %}} + +| Scraping tool | InfluxDB Metric version | +| :----------------------------------------------------------------------------------------- | ----------------------------------------------------: | +| [Telegraf Prometheus plugin](/{{< latest "telegraf" >}}/plugins/#prometheus) | _Determined by `metric_version` configuration option_ | +| [InfluxDB scraper](/influxdb/v2.0/write-data/no-code/scrape-data/) | 1 | +| Flux [`prometheus.scrape()`]({{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/) | 2 | + +{{% /oss-only %}} +{{% cloud-only %}} + +| Scraping tool | InfluxDB Metric version | +| :----------------------------------------------------------------------------------------- | ----------------------------------------------------: | +| [Telegraf Prometheus plugin](/{{< latest "telegraf" >}}/plugins/#prometheus) | _Determined by `metric_version` configuration option_ | +| Flux [`prometheus.scrape()`]({{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/) | 2 | + +{{% /cloud-only %}} + +## Metric version 1 + +- **_time**: timestamp +- **_measurement**: [Prometheus metric name](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) + _(`_bucket`, `_sum`, and `_count` are trimmed from histogram and summary metric names)_ +- **\_field**: _depends on the [Prometheus metric type](https://prometheus.io/docs/concepts/metric_types/)_ + - Counter: `counter` + - Gauge: `gauge` + - Histogram: _histogram bucket upper limits_, `count`, `sum` + - Summary: _summary quantiles_, `count`, `sum` +- **_value**: [Prometheus metric value](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) +- **tags**: A tag for each [Prometheus label](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) + _(except for histogram bucket upper limits (`le`) or summary quantiles (`quantile`))_. + The label name is the tag key and the label value is the tag value. + +### Example Prometheus query results +The following are example Prometheus metrics scraped from the **InfluxDB OSS 2.x `/metrics`** endpoint: + +```sh +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 1.42276424e+09 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 5.259247e+06 +# HELP task_executor_run_latency_seconds Records the latency between the time the run was due to run and the time the task started execution, by task type +# TYPE task_executor_run_latency_seconds histogram +task_executor_run_latency_seconds_bucket{task_type="system",le="0.25"} 4413 +task_executor_run_latency_seconds_bucket{task_type="system",le="0.5"} 11901 +task_executor_run_latency_seconds_bucket{task_type="system",le="1"} 12565 +task_executor_run_latency_seconds_bucket{task_type="system",le="2.5"} 12823 +task_executor_run_latency_seconds_bucket{task_type="system",le="5"} 12844 +task_executor_run_latency_seconds_bucket{task_type="system",le="10"} 12864 +task_executor_run_latency_seconds_bucket{task_type="system",le="+Inf"} 74429 +task_executor_run_latency_seconds_sum{task_type="system"} 4.256783538679698e+11 +task_executor_run_latency_seconds_count{task_type="system"} 74429 +# HELP task_executor_run_duration The duration in seconds between a run starting and finishing. +# TYPE task_executor_run_duration summary +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.5"} 5.178160855 +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.9"} 5.178160855 +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.99"} 5.178160855 +task_executor_run_duration_sum{taskID="00xx0Xx0xx00XX0x0",task_type="threshold"} 2121.9758301650004 +task_executor_run_duration_count{taskID="00xx0Xx0xx00XX0x0",task_type="threshold"} 570 +``` + +#### Resulting line protocol +``` +go_memstats_alloc_bytes_total counter=1.42276424e+09 +go_memstats_buck_hash_sys_bytes gauge=5.259247e+06 +task_executor_run_latency_seconds,task_type=system 0.25=4413,0.5=11901,1=12565,2.5=12823,5=12844,10=12864,+Inf=74429,sum=4.256783538679698e+11,count=74429 +task_executor_run_duration,taskID=00xx0Xx0xx00XX0x0,task_type=threshold 0.5=5.178160855,0.9=5.178160855,0.99=5.178160855,sum=2121.9758301650004,count=570 +``` + +{{< expand-wrapper >}} +{{% expand "View version 1 tables when queried from InfluxDB" %}} +| _time | _measurement | _field | _value | +| :------------------------ | :---------------------------- | :------ | -----------: | +| {{< flux/current-time >}} | go_memstats_alloc_bytes_total | counter | 1422764240.0 | + +| _time | _measurement | _field | _value | +| :------------------------ | :------------------------------ | :----- | --------: | +| {{< flux/current-time >}} | go_memstats_buck_hash_sys_bytes | gauge | 5259247.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | -----: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | 0.25 | 4413.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | ------: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | 0.5 | 11901.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | ------: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | 1 | 12565.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | ------: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | 2.5 | 12823.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | ------: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | 5 | 12844.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | ------: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | +Inf | 74429.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | ----------------: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | sum | 425678353867.9698 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :-------------------------------- | :-------- | :----- | -----: | +| {{< flux/current-time >}} | task_executor_run_latency_seconds | system | count | 74429.0 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :------------------------- | :-------- | :----- | ----------: | +| {{< flux/current-time >}} | task_executor_run_duration | threshold | 0.5 | 5.178160855 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :------------------------- | :-------- | :----- | ----------: | +| {{< flux/current-time >}} | task_executor_run_duration | threshold | 0.9 | 5.178160855 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :------------------------- | :-------- | :----- | ----------: | +| {{< flux/current-time >}} | task_executor_run_duration | threshold | 0.99 | 5.178160855 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :------------------------- | :-------- | :----- | -----------------: | +| {{< flux/current-time >}} | task_executor_run_duration | threshold | sum | 2121.9758301650004 | + +| _time | _measurement | task_type | _field | _value | +| :------------------------ | :------------------------- | :-------- | :----- | -----: | +| {{< flux/current-time >}} | task_executor_run_duration | threshold | count | 570.0 | +{{% /expand %}} +{{< /expand-wrapper >}} + +## Metrics version 2 + +- **_time**: timestamp +- **_measurement**: `prometheus` +- **_field**: [Prometheus metric name](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) + _(`_bucket` is trimmed from histogram metric names)_ +- **_value**: [Prometheus metric value](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels) +- **url**: URL metrics were scraped from +- **tags**: A tag for each [Prometheus label](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). + The label name is the tag key and the label value is the tag value. + +### Example Prometheus query results +The following are example Prometheus metrics scraped from the **InfluxDB OSS 2.x `/metrics`** endpoint: + +```sh +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 1.42276424e+09 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 5.259247e+06 +# HELP task_executor_run_latency_seconds Records the latency between the time the run was due to run and the time the task started execution, by task type +# TYPE task_executor_run_latency_seconds histogram +task_executor_run_latency_seconds_bucket{task_type="system",le="0.25"} 4413 +task_executor_run_latency_seconds_bucket{task_type="system",le="0.5"} 11901 +task_executor_run_latency_seconds_bucket{task_type="system",le="1"} 12565 +task_executor_run_latency_seconds_bucket{task_type="system",le="2.5"} 12823 +task_executor_run_latency_seconds_bucket{task_type="system",le="5"} 12844 +task_executor_run_latency_seconds_bucket{task_type="system",le="10"} 12864 +task_executor_run_latency_seconds_bucket{task_type="system",le="+Inf"} 74429 +task_executor_run_latency_seconds_sum{task_type="system"} 4.256783538679698e+11 +task_executor_run_latency_seconds_count{task_type="system"} 74429 +# HELP task_executor_run_duration The duration in seconds between a run starting and finishing. +# TYPE task_executor_run_duration summary +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.5"} 5.178160855 +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.9"} 5.178160855 +task_executor_run_duration{taskID="00xx0Xx0xx00XX0x0",task_type="threshold",quantile="0.99"} 5.178160855 +task_executor_run_duration_sum{taskID="00xx0Xx0xx00XX0x0",task_type="threshold"} 2121.9758301650004 +task_executor_run_duration_count{taskID="00xx0Xx0xx00XX0x0",task_type="threshold"} 570 +``` + +#### Resulting line protocol +{{< keep-url >}} +``` +prometheus,url=http://localhost:8086/metrics go_memstats_alloc_bytes_total=1.42276424e+09 +prometheus,url=http://localhost:8086/metrics go_memstats_buck_hash_sys_bytes=5.259247e+06 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=0.25 task_executor_run_latency_seconds=4413 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=0.5 task_executor_run_latency_seconds=11901 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=1 task_executor_run_latency_seconds=12565 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=2.5 task_executor_run_latency_seconds=12823 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=5 task_executor_run_latency_seconds=12844 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=10 task_executor_run_latency_seconds=12864 +prometheus,url=http://localhost:8086/metrics,task_type=system,le=+Inf task_executor_run_latency_seconds=74429 +prometheus,url=http://localhost:8086/metrics,task_type=system task_executor_run_latency_seconds_sum=4.256783538679698e+11 +prometheus,url=http://localhost:8086/metrics,task_type=system task_executor_run_latency_seconds_count=74429 +prometheus,url=http://localhost:8086/metrics,taskID=00xx0Xx0xx00XX0x0,task_type=threshold quantile=0.5 task_executor_run_duration=5.178160855 +prometheus,url=http://localhost:8086/metrics,taskID=00xx0Xx0xx00XX0x0,task_type=threshold quantile=0.9 task_executor_run_duration=5.178160855 +prometheus,url=http://localhost:8086/metrics,taskID=00xx0Xx0xx00XX0x0,task_type=threshold quantile=0.99 task_executor_run_duration=5.178160855 +prometheus,url=http://localhost:8086/metrics,taskID=00xx0Xx0xx00XX0x0,task_type=threshold task_executor_run_duration_sum=2121.9758301650004 +prometheus,url=http://localhost:8086/metrics,taskID=00xx0Xx0xx00XX0x0,task_type=threshold task_executor_run_duration_count=570 +``` + +{{< expand-wrapper >}} +{{% expand "View version 2 tables when queried from InfluxDB" %}} +| _time | _measurement | url | _field | _value | +| :------------------------ | :----------- | :---------------------------- | :---------------------------- | -----------: | +| {{< flux/current-time >}} | prometheus | http://localhost:8086/metrics | go_memstats_alloc_bytes_total | 1422764240.0 | + +| _time | _measurement | url | _field | _value | +| :------------------------ | :----------- | :---------------------------- | :------------------------------ | --------: | +| {{< flux/current-time >}} | prometheus | http://localhost:8086/metrics | go_memstats_buck_hash_sys_bytes | 5259247.0 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :--- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 0.25 | task_executor_run_latency_seconds | 4413 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 0.5 | task_executor_run_latency_seconds | 11901 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 1 | task_executor_run_latency_seconds | 12565 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 2.5 | task_executor_run_latency_seconds | 12823 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | 5 | task_executor_run_latency_seconds | 12844 | + +| _time | _measurement | task_type | url | le | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :--- | :-------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | +Inf | task_executor_run_latency_seconds | 74429 | + +| _time | _measurement | task_type | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :------------------------------------ | ----------------: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | task_executor_run_latency_seconds_sum | 425678353867.9698 | + +| _time | _measurement | task_type | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------------------- | :-------------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | system | http://localhost:8086/metrics | task_executor_run_latency_seconds_count | 74429 | + +| _time | _measurement | task_type | taskID | url | quantile | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------- | :------------------------- | ----------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | 0.5 | task_executor_run_duration | 5.178160855 | + +| _time | _measurement | task_type | taskID | url | quantile | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------- | :------------------------- | ----------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | 0.9 | task_executor_run_duration | 5.178160855 | + +| _time | _measurement | task_type | taskID | url | quantile | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------- | :------------------------- | ----------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | 0.99 | task_executor_run_duration | 5.178160855 | + +| _time | _measurement | task_type | taskID | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :----------------------------- | -----------------: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | task_executor_run_duration_sum | 2121.9758301650004 | + +| _time | _measurement | task_type | taskID | url | _field | _value | +| :------------------------ | :----------- | :-------- | :---------------- | :---------------------------- | :------------------------------- | -----: | +| {{< flux/current-time >}} | prometheus | threshold | 00xx0Xx0xx00XX0x0 | http://localhost:8086/metrics | task_executor_run_duration_count | 570 | +{{% /expand %}} +{{< /expand-wrapper >}} diff --git a/content/influxdb/v2.0/write-data/developer-tools/scrape-prometheus-metrics.md b/content/influxdb/v2.0/write-data/developer-tools/scrape-prometheus-metrics.md new file mode 100644 index 000000000..0f69e4fd8 --- /dev/null +++ b/content/influxdb/v2.0/write-data/developer-tools/scrape-prometheus-metrics.md @@ -0,0 +1,105 @@ +--- +title: Scrape Prometheus metrics +seotitle: Scape Prometheus metrics into InfluxDB +weight: 205 +description: > + Use Telegraf, InfluxDB scrapers, or the `prometheus.scrape` Flux function to + scrape Prometheus-formatted metrics from an HTTP-accessible endpoint and store + them in InfluxDB. +menu: + influxdb_2_0: + name: Scrape Prometheus metrics + parent: Developer tools +related: + - /{{< latest "telegraf" >}}/plugins/#prometheus, Telegraf Prometheus input plugin + - /{{< latest "flux" >}}/prometheus/scrape-prometheus/, Scrape Prometheus metrics with Flux + - /{{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/ + - /{{< latest "flux" >}}/prometheus/metric-types/ + - /influxdb/v2.0/reference/prometheus-metrics/ + - /influxdb/v2.0/write-data/no-code/scrape-data/ +influxdb/v2.0/tags: [prometheus, scraper] +--- + +Use [Telegraf](/{{< latest "telegraf" >}}/){{% oss-only %}}, [InfluxDB scrapers](/influxdb/v2.0/write-data/no-code/scrape-data/),{{% /oss-only %}} +or the [`prometheus.scrape` Flux function](/{{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/) +to scrape Prometheus-formatted metrics from an HTTP-accessible endpoint and store them in InfluxDB. + +{{% oss-only %}} + +- [Use Telegraf](#use-telegraf) +- [Use an InfluxDB scraper](#use-an-influxdb-scraper) +- [Use prometheus.scrape()](#use-prometheusscrape) + +{{% /oss-only %}} +{{% cloud-only %}} + +- [Use Telegraf](#use-telegraf) +- [Use prometheus.scrape()](#use-prometheusscrape) + +{{% /cloud-only %}} + +## Use Telegraf +To use Telegraf to scrape Prometheus-formatted metrics from an HTTP-accessible +endpoint and write them to InfluxDB{{% cloud-only %}} Cloud{{% /cloud-only %}}, follow these steps: + +1. Add the [Prometheus input plugin](/{{< latest "telegraf" >}}/plugins/#prometheus) to your Telegraf configuration file. + 1. Set the `urls` to scrape metrics from. + 2. Set the `metric_version` configuration option to specify which + [metric parsing version](/influxdb/v2.0/reference/prometheus-metrics/) to use + _(version `2` is recommended)_. +2. Add the [InfluxDB v2 output plugin](/{{< latest "telegraf" >}}/plugins/#influxdb_v2) + to your Telegraf configuration file and configure it to to write to + InfluxDB{{% cloud-only %}} Cloud{{% /cloud-only %}}. + +##### Example telegraf.conf +```toml +# ... + +## Collect Prometheus formatted metrics +[[inputs.prometheus]] + urls = ["http://example.com/metrics"] + metric_version = 2 + +## Write Prometheus formatted metrics to InfluxDB +[[outputs.influxdb_v2]] + urls = ["http://localhost:8086"] + token = "$INFLUX_TOKEN" + organization = "example-org" + bucket = "example-bucket" + +# ... +``` + +{{% oss-only %}} + +## Use an InfluxDB scraper +InfluxDB scrapers automatically scrape Prometheus-formatted metrics from an +HTTP-accessible endpoint at a regular interval. +For information about setting up an InfluxDB scraper, see +[Scrape data using InfluxDB scrapers](/influxdb/v2.0/write-data/no-code/scrape-data/). + +{{% /oss-only %}} + +## Use prometheus.scrape() +To use the [`prometheus.scrape()` Flux function](/{{< latest "flux" >}}/stdlib/experimental/prometheus/scrape/) +to scrape Prometheus-formatted metrics from an HTTP-accessible endpoint and write +them to InfluxDB{{% cloud-only %}} Cloud{{% /cloud-only %}}, do the following in your Flux script: + +1. Import the [`experimental/prometheus` package](/{{< latest "flux" >}}/stdlib/experimental/prometheus/). +2. Use `prometheus.scrape()` and provide the URL to scrape metrics from. +3. Use [`to()`](/{{< latest "flux" >}}/stdlib/influxdata/influxdb/to/) and specify the InfluxDB{{% cloud-only %}} Cloud{{% /cloud-only %}} bucket to write + the scraped metrics to. + +##### Example Flux script +```js +import "experimental/prometheus" + +prometheus.scrape(url: "http://example.com/metrics") + |> to(bucket: "example-bucket") +``` + +4. (Optional) To scrape Prometheus metrics at regular intervals using Flux, add your Flux +scraping script as an [InfluxDB task](/{{< latest "influxdb" >}}/process-data/). + +_For information about scraping Prometheus-formatted metrics with `prometheus.scrape()`, +see [Scrape Prometheus metrics with Flux](/{{< latest "flux" >}}/prometheus/scrape-prometheus/)._ diff --git a/content/influxdb/v2.0/write-data/no-code/scrape-data/_index.md b/content/influxdb/v2.0/write-data/no-code/scrape-data/_index.md index dcd8b759d..751051092 100644 --- a/content/influxdb/v2.0/write-data/no-code/scrape-data/_index.md +++ b/content/influxdb/v2.0/write-data/no-code/scrape-data/_index.md @@ -1,6 +1,5 @@ --- -title: Scrape data -seotitle: Scrape data using InfluxDB scrapers +title: Scrape data using InfluxDB scrapers weight: 103 description: > Scrape data from InfluxDB instances or remote endpoints using InfluxDB scrapers. @@ -15,7 +14,6 @@ menu: influxdb_2_0: name: Scrape data parent: No-code solutions -products: [oss] --- InfluxDB scrapers collect data from specified targets at regular intervals, diff --git a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/_index.md b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/_index.md index 562ccea19..687f582e8 100644 --- a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/_index.md +++ b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/_index.md @@ -1,6 +1,5 @@ --- -title: Manage scrapers -seotitle: Manage InfluxDB scrapers +title: Manage InfluxDB scrapers description: Create, update, and delete InfluxDB data scrapers in the InfluxDB user interface. aliases: - /influxdb/v2.0/collect-data/scrape-data/manage-scrapers @@ -10,8 +9,7 @@ menu: name: Manage scrapers parent: Scrape data weight: 201 -influxdb/v2.0/tags: [scraper] -products: [oss] +influxdb/v2.0/tags: [scraper, prometheus] --- The following articles walk through managing InfluxDB scrapers: diff --git a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/create-a-scraper.md b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/create-a-scraper.md index 433f33049..15552e9f8 100644 --- a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/create-a-scraper.md +++ b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/create-a-scraper.md @@ -1,15 +1,15 @@ --- -title: Create a scraper -seotitle: Create an InfluxDB scraper +title: Create an InfluxDB scraper +list_title: Create a scraper description: Create an InfluxDB scraper that collects data from InfluxDB or a remote endpoint. aliases: - /influxdb/v2.0/collect-data/scrape-data/manage-scrapers/create-a-scraper - /influxdb/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper menu: influxdb_2_0: + name: Create a scraper parent: Manage scrapers weight: 301 -products: [oss] --- Create a new scraper in the InfluxDB user interface (UI). diff --git a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/delete-a-scraper.md b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/delete-a-scraper.md index 982af3e16..c0ed3c510 100644 --- a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/delete-a-scraper.md +++ b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/delete-a-scraper.md @@ -1,15 +1,15 @@ --- -title: Delete a scraper -seotitle: Delete an InfluxDB scraper +title: Delete an InfluxDB scraper +list_title: Delete a scraper description: Delete an InfluxDB scraper in the InfluxDB user interface. aliases: - /influxdb/v2.0/collect-data/scrape-data/manage-scrapers/delete-a-scraper - /influxdb/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper menu: influxdb_2_0: + name: Delete a scraper parent: Manage scrapers weight: 303 -products: [oss] --- Delete a scraper from the InfluxDB user interface (UI). diff --git a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/update-a-scraper.md b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/update-a-scraper.md index 83e47268f..232b29a73 100644 --- a/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/update-a-scraper.md +++ b/content/influxdb/v2.0/write-data/no-code/scrape-data/manage-scrapers/update-a-scraper.md @@ -1,15 +1,15 @@ --- -title: Update a scraper -seotitle: Update an InfluxDB scraper +title: Update an InfluxDB scraper +list_title: Update a scraper description: Update an InfluxDB scraper that collects data from InfluxDB or a remote endpoint. aliases: - /influxdb/v2.0/collect-data/scrape-data/manage-scrapers/update-a-scraper - /influxdb/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper menu: influxdb_2_0: + name: Update a scraper parent: Manage scrapers weight: 302 -products: [oss] --- Update a scraper in the InfluxDB user interface (UI). diff --git a/content/influxdb/v2.0/write-data/no-code/scrape-data/scrapable-endpoints.md b/content/influxdb/v2.0/write-data/no-code/scrape-data/scrapable-endpoints.md index 687889e38..b826588dd 100644 --- a/content/influxdb/v2.0/write-data/no-code/scrape-data/scrapable-endpoints.md +++ b/content/influxdb/v2.0/write-data/no-code/scrape-data/scrapable-endpoints.md @@ -12,7 +12,7 @@ menu: influxdb_2_0: parent: Scrape data weight: 202 -influxdb/v2.0/tags: [scraper] +influxdb/v2.0/tags: [scraper, prometheus] --- InfluxDB scrapers can collect data from any HTTP(S)-accessible endpoint that returns data diff --git a/layouts/partials/footer/javascript.html b/layouts/partials/footer/javascript.html index e532b168a..e2ecc1bdc 100644 --- a/layouts/partials/footer/javascript.html +++ b/layouts/partials/footer/javascript.html @@ -7,8 +7,10 @@ {{ $notifications := resources.Get "js/notifications.js" }} {{ $keybindings := resources.Get "js/keybindings.js" }} {{ $fluxGroupKeys := resources.Get "js/flux-group-keys.js" }} +{{ $fluxCurrentTime := resources.Get "js/flux-current-time.js" }} {{ $footerjs := slice $versionSelector $contentInteractions $searchInteractions $listFilters $influxdbURLs $featureCallouts $notifications $keybindings | resources.Concat "js/footer.bundle.js" | resources.Fingerprint }} {{ $fluxGroupKeyjs := slice $fluxGroupKeys | resources.Concat "js/flux-group-keys.js" | resources.Fingerprint }} +{{ $fluxCurrentTimejs := slice $fluxCurrentTime | resources.Concat "js/flux-current-time.js" | resources.Fingerprint }} <!-- Load cloudUrls array --> <script type="text/javascript"> @@ -44,4 +46,9 @@ <!-- Load group key demo JS if when the group key demo shortcode is present --> {{ if .Page.HasShortcode "flux/group-key-demo" }} <script type="text/javascript" src="{{ $fluxGroupKeyjs.RelPermalink }}"></script> +{{ end }} + +<!-- Load Flux current time js if when the flux/current-time shortcode is present --> +{{ if .Page.HasShortcode "flux/current-time" }} +<script type="text/javascript" src="{{ $fluxCurrentTime.RelPermalink }}"></script> {{ end }} \ No newline at end of file diff --git a/layouts/shortcodes/cite.html b/layouts/shortcodes/cite.html new file mode 100644 index 000000000..f837d7c75 --- /dev/null +++ b/layouts/shortcodes/cite.html @@ -0,0 +1 @@ +<span class="cite">{{ .Inner }}</span> \ No newline at end of file diff --git a/layouts/shortcodes/flex-content.html b/layouts/shortcodes/flex-content.html index 8458f6fa4..9af32f6aa 100644 --- a/layouts/shortcodes/flex-content.html +++ b/layouts/shortcodes/flex-content.html @@ -1,5 +1,5 @@ {{ $width := .Get 0 | default "half" }} {{ $_hugo_config := `{ "version": 1 }` }} <div class="flex-container {{ $width }}"> - {{ .Inner }} +{{ .Inner }} </div> diff --git a/layouts/shortcodes/flex.html b/layouts/shortcodes/flex.html index 5943fba4b..6f8b60b51 100644 --- a/layouts/shortcodes/flex.html +++ b/layouts/shortcodes/flex.html @@ -1,4 +1,4 @@ {{ $_hugo_config := `{ "version": 1 }` }} <div class="flex-wrapper"> - {{ .Inner }} +{{ .Inner }} </div> diff --git a/layouts/shortcodes/flux/current-time.html b/layouts/shortcodes/flux/current-time.html new file mode 100644 index 000000000..3975a0619 --- /dev/null +++ b/layouts/shortcodes/flux/current-time.html @@ -0,0 +1 @@ +<span class="current-time nowrap">2021-01-01T00:00:00Z</span> \ No newline at end of file diff --git a/layouts/shortcodes/img-hd.html b/layouts/shortcodes/img-hd.html index a49801b1b..be211dfde 100644 --- a/layouts/shortcodes/img-hd.html +++ b/layouts/shortcodes/img-hd.html @@ -3,10 +3,10 @@ {{ $alt := .Get "alt" }} {{ if (fileExists ( print "/static" $src )) }} - {{ with (imageConfig ( print "/static" $src )) }} - {{ $imageWidth := div .Width 2 }} - <img src='{{ $src }}' alt='{{ $alt }}' width='{{ $imageWidth }}' /> - {{ end }} -{{ else }} - <img src='{{ $src }}' alt='{{ $alt }}'/> +{{ with (imageConfig ( print "/static" $src )) }} +{{ $imageWidth := div .Width 2 }} +<img src='{{ $src }}' alt='{{ $alt }}' width='{{ $imageWidth }}' /> +{{ end }} +{{ else }} +<img src='{{ $src }}' alt='{{ $alt }}'/> {{ end }} diff --git a/layouts/shortcodes/nowrap.html b/layouts/shortcodes/nowrap.html index 5036b27a7..8f50267c9 100644 --- a/layouts/shortcodes/nowrap.html +++ b/layouts/shortcodes/nowrap.html @@ -1 +1 @@ -<span style="white-space:nowrap">{{ .Inner }}</span> \ No newline at end of file +<span class="nowrap">{{ .Inner }}</span> diff --git a/layouts/shortcodes/tabs.html b/layouts/shortcodes/tabs.html index 67eac6bea..5e0480e46 100644 --- a/layouts/shortcodes/tabs.html +++ b/layouts/shortcodes/tabs.html @@ -1,4 +1,6 @@ {{ $_hugo_config := `{ "version": 1 }` }} -<div class="tabs"> +{{ $styleParsed := .Get 0 | default "" }} +{{ $style := .Get "style" | default $styleParsed }} +<div class="tabs {{ $style }}"> {{ .Inner }} </div> diff --git a/static/img/flux/0-x-prometheus-counter-aggregate-rate-output.png b/static/img/flux/0-x-prometheus-counter-aggregate-rate-output.png new file mode 100644 index 0000000000000000000000000000000000000000..4996b7543315291a30ec6f6015b33c3cc5324780 GIT binary patch literal 11242 zcmaKS2Q*w?7cUVcMDM*tFN26)B3hzGiC#x%bVes4VGu+Rq9%lpL>XoDl9(Yn(S}hH zQ4&TEBAC28{^k4LTJL*VEBDSlXYYOXKKu9E=bU>b-80moAY&yXARwT)dq>lRfZ!4u z_)mO=2xwWVis%JyEWuiq!KQw0!J$rpt_12XeqdMbyFO0tt|qQdF5v<FuF3=iL;{{> zmcf<=`ijneJ`zrN8Hq3-e?XgnKv^x!-^tnAHJBUh>h9^Q!n@Pf#mnvKqQYx&(?HU| zU&GbI^G-ydt7(LxnRA4<vw{n+nku()m?B`n$2HiAJIn{-8>ASf!h2y?5%`U72Jv!V zhy;79@c!kLrNKRJ4ZlEFZaE1lac4<MNp3j>2^S}@lQS4B#w{%=Ed`R40ZGY-OG+x< zP*9YS;r{y{FECu7i<_c}ruN^10Z%Ht9>Kx>iXc#EXsAT!4GF(McaW5Vf&xfV8YC?( z4oHXxh5H6Og^BwH@%>{#(>2IB(9=KI)6bV1Z_x?t7ZR+(3%L4M3_kw<n)MC(d!B$9 z1BE&HgQO%R@iF})XkhUF7xnS^S2`%z#PvV^{yz-|nT7kif=pb4{6Yeqfy}w_;fL~9 z)ChES3ib;$^YerJGmZB={DS?0JpBB*rKKfqatj$aIeYrzTZAuE3=9<S`UV9%`8vDa z)l}gHj7WHTx+u!t(2$mt0p?giLq<wUOG8~jO8&Ntq@=8zq=vktyw*Runtsk9KCZsO z|LD5>NB746)WyTW#~&D3(>2f&>gu8$=;y<I5w)V{|Mo@lf7<(7*X4ivBK1FYL4Y$L zd~W|M*Z(vD0K)(L7rMa1zu<TE1rQ$yKzq3EQ#HUCf_wUAT8z>f>?Yn7?;FLd7Pz^E z8k;|gSI%CKe#IcBlwb7bdU#=Td+*EAs%m&Ui>6iKtG6O~sM>~3Ep0=w@+o%q>ohEU zZJnR)8C$)tZI!57k?KAYDIDOm3g&iuB>en?ROe3x1$8=psdv@Q&tH^EODkSC_od?z zi;78nmR-bY7cL=jQ=)dczN!1ZxkJ*E?3*`L)Yb0_Ccy=tG+0@I(=zhd3|u6eu|lbc zySgU4{uwmX%z?qtqAy1hU>RW%@k|PO+@47)s@fpLhK;QYk58&(>o%8Tw1cAuv#JR* zGq*rOm4Sh|t(}`tMyq7Uz9ZN(CN_!7`2qifGSQMT5n(Al=nH{IZ)4+<-8}+aTzy&8 z&0kl*S#=$G<+V9E`IAzzB-{5yi-tfA>m26(Z{9TsWwz6D2!%jnOUi46v%0A1IiO*2 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-counter-derivative-output.png b/static/img/flux/0-x-prometheus-counter-derivative-output.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d50d0aad260478143a84e1b7f74bcecee86d9b GIT binary patch literal 11779 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-counter-difference-output.png b/static/img/flux/0-x-prometheus-counter-difference-output.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd6b146e95430abc7adbcc9ab09d6c6c0038bcb GIT binary patch literal 12599 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-counter-increase-input.png b/static/img/flux/0-x-prometheus-counter-increase-input.png new file mode 100644 index 0000000000000000000000000000000000000000..a6626685b06258470a42165f69f67b5394e73b7d GIT binary patch literal 10937 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-counter-increase-output.png b/static/img/flux/0-x-prometheus-counter-increase-output.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3b5b5b1ee0263d7cd70c0e8ada4ef17f13d69e GIT binary patch literal 9299 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-counter-normalized-input.png b/static/img/flux/0-x-prometheus-counter-normalized-input.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1f278dd95bd8550919d17e28d5c7f5a2d6a5a3 GIT binary patch literal 9095 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 C!;Dk_ literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png b/static/img/flux/0-x-prometheus-gauge-aggregate-rate-output.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f2028d6c1c19fbdaa84c3555ce0737e4015bad GIT binary patch literal 10763 zcma)iby!qi*EUKCNOuq2-3=lsErPTREkh4o0@6x{NGh#_12Qxy3?(H<3?T>zij*J> zBK4kw&+mDkKfdR^KCX*v&fa^id)+JcI{VC=L?Z(&VnPN&EG#Ty9qrpDSXkH5z(4K{ zY+z=&Hl!c;poeSRhu`&bh6mdFI$^0fdO@8aIv(~eP9{$Fj=?@dPKsDq*xYWW_u=>T z_2eDAJcR8*8Q~xgZ$KLhOHn1r+up(52@Ziexwv^MvG28avqRh*mDtUt^hNc()ty}3 zv_pKI?uHncI)u18$T_mBC_@y3<N*K=C%8Q%$OGo-Cm*E5euXO!T!Ygh?2s!FxVsYj zUsCt=jUeh?zD^JsVKE^GQBhHdjGVBeJ=ER-3KfKii;9bhh)RlxNeYRI%1g+}OG-li z^~VmF^L2EVH@U6(FJr(+iQN?r_m&qC2@DJr4wMk~@^ujrlarGZ5fv8^7Z(B~g#3a% z;r2m7o_-wvAl!EHbMSTZhP!!rLO?`&sFy!ni5;N&*9Q;pf5UqE{VPsD#6*JZy+y=? zMM0nb5!BcJzePPf{w?hXH*xx3zW+~PKht1uClM1TKQDh@2Ox9K9H1$0d39eWd$^ac zsh1b*pD-G^dcnQ?T)n&@;^M+m5MF(I2RBb}hVM#6UteCw(+_U%>ENVuTZtV25q5KP zlowNzm6no|loONFln@isP*;-^lf5M=Dk?1_sxB)ktMQNSZ7&CZ4<}FfKe~?ptE={3 zb-{A*@CGd3cJg%#aB|f2_40sRc`fhu-?_;ASG<4eI{tSqvj0_A1Rx^<=Jr2w{m&Fo zK;Y%SOBWdYyZD_vfr|G9N;_<bqYKzESVnrL8vKPHXvEc-nYqN?VOl!+^NT7qH4U0t zdJ12>dh@o6oSu`#(w{T@MMid!aKqR3u0aM3OR=s)j^G0RJXB6zX;n>=k+DS`qNC<b z8^kFl@kur%mpEU}dvS63#^!f%3F)uvT3(dZhDF2+zgbmN(-CdkwXlHRGqaPES7WgW zreqTmC>fKIQlgc;!@$7KlZ0UNcq-a?prdOdEG(6h{#;2}lQ*M7U*C*7t`_nzkzUQr z+SZvjt<B2XF(@R4LD!yINGUQZiPa&>7aqpXC&v09oPwFx?t!bo%a4vuo}w+=La*i- z^_@5Z@&v2Ud|6#Wb<1Q_%yi1ef+<Z8pl)1`%DJMeMBZ-DDHw<}ZwXe+@H|D9RUt%L zwwX*lODo>6d#8)M{l;YcFg!8=+1kr&=Hue(!w%2M$}REs38{SbmizH5fua$3KqM8v ztZ2v2fS@RL-z=e;&oIxx#N;e5?_dwFpput0hDPQwu_=P36VZ>Ka&rmtrZk6!#ff$O zdI*ElN^3)0<4MWr1j{~AQ!xqEEIBxOFlgHfR!lJ&IFnH@P*X8b@kogxH`%???wVS2 zC)5j;O_9?Ay@NL`v%vMCF9$n6wV(ny8Ld#=l3>;B<M=c;cQ}W(_3hhwf<h8x<aEg? zxlAVRLbXerCa$C;G?WzdT|FZO#nsf*O!RaB4iBTD3p*R1K-nZ4><Ld=D;*sxDJcz; zksAX&go2!|<K2hO_rq<S15uBk(9*EPCuWL@%J>I95^euUMajU)DIh2yp`f5Hg4~2U zz|8MIc$QyINy!iu^TgT3o0f(d!pbdN_vLY1DjS5S@>OF?dmkAkV^&TvGZP0LElWjp zBO5!Pk6&2lyJ3^NR>7f<d3i)^?ObGKRqp7SwsiDqY8!HJ2#B`sFy3(xdcB~fWyqgD zP+r|2R6Qpnqr%9@&d$yUVdG_#(iAM85{RqeO>Gfr+~7~BV-``;y>l1BBgV!jNiCwn z7o0DcKS)MSFWR=l=AO)x+(=47J%LxFiG{`CrE^=&G-!UikjR?KylC&egZMmzbeT|= z;dWWNYcl&PQ6iF#6-Se}B%|b|&O1$gQ}|OHdVGqUdtP1?Oqm*`3Po)0GjlA|TEr<C z&-8kpr8&+hj_6${S!)UHY|HOl^l#d&ezh_2@uU8ydikT%2xZGuWgGvhKbXzP!pK=Z z)@xWK`|sJX$QZE_h_O(3SWs*%#I=7uAEB{SVOS99e?CF6J?hh-d(&<MORdeXK6FJ_ zyn2-^n_psuAhipw$~G@78P?k34Ig_Ec%jN?<7z$>$XCmf`iY>8@^t(yb9hL1sxnMs ziz(!rEM{zAoBt%#?7+Uj01FYt-*+*wJUF6!1943Yn(Ai7WM$IuB`1hL_I26U)YT+( zJ&QuOPyaoO&Ww!ViumRTS%)Hs^=Fm9HBupWf!ON$&i!pxeHv&nW82PvJMC^m%a72Y z^F?M6YV8+ieOp{yc8L;ecXV|F2r}<zHUyFg^X2(iCkXLb1Z@2}4ji|^JiY&=c`rLl zkJ^P$SGR6YNw(BcK|rp#%#mS?_l^0s%iOB^0PYGyevwOVbo)Bp`X>s^{I{3EDm1jS zvHEme23jn+vnj3I*$h8@6cDT|Lbb1LKO*<LF`3QMUlovK++&I7Ja^IXJkc5{mNp2? z@v>X)_I!QSg}+bt>M8cz$m2V;xLPYuqCNX;{qMy!wS*Q!hZi0rwlD1kS6LvhPIx9> z4mC77|B2)`bh%$st}u^cu^V;1O}TlIW3$6BZL&KO)QBFaO*;2npczLI_FPXO4)Nb_ zv4v^pDNW;^&qZ!8T#8zq%&6E{4{|Sz5?;FPsGH2)vuhNG!;{hHGj*BelF6ONl+xjQ zrHGMP5s_zsTnvhT{zQnS(LsOkV*W69Q#H3a49qt>AyjMx>d3mK1^enk9OHl6hz1R$ z$oObR*+A_m%>^YyVAKw)Xd>GC5)t=cVX4D}jqgsA(3V9s(7wLZuTA3(X}705t&`Df zecZ*J{-ujG$xM608y41KYGJ({DbVKbAgVs)1+A3iKY>(?w5cVPP!$oIFX7yy$x+C` za-VkmWDkjRnV~rmLxP@La^K0~8aM4Nwuzk8WSSC`?!Y4KLU)>eZ8SU~fI7Zk5>6oA zHL`+sKZw9Tr-NeS_g!%6X^y$x5khdLLG*TJAD(YzG`h@v(3bu@SaELYK+2EtgE@SX zu|zGQcYhruw)Sdl-=}iHyHndjjOZhsvqfkNqVPKRsO`ge=VVO^&eb}upAFASz>>mK zggl|2y4}c6xqJ>1M}mXf@Akd3C?JnHv}izw;+|Y@YD5dRkSpiJ&>+me5?Uz+;X$$E z`!14@0YM4xHT}zL9FL*N=YivhO?M&aC89jrV=c7xoO&#gc<=rSvroEBNyH&fBU-&r zVA>2Z*Z0Z@GJyGnI*)Lyi{r&uO4~g8L;y=vf<=wgh~U^4q1)M{6Qk^V`1bkt3m$}^ zD$wWsUB4<8`CMs2i|A6jd!ak&99kC-ma^$GRRR_{<Cdo@aWc^kvRvEw_0<;JUVX~B z83>2t51s5=^(mi)Bfpm!og(%w|5zlWp=m0Pm-o*|2+@K2gA5;&&&ysbO(4G+5WKWF zmnK0lJLJ<}7`v-rtoPOT(N?ST!y7i8Ji<3mV}4&Q&ZKE+Qk^DW9E7QzM!@!y*H+U4 zhABr_ubqU@V1=Ss1Qh!(E_)Yxmc%BrAH1iRqih(<K{sUDU3|<bX>Iz@G5T(%_~rA8 zx7**UMNl6d3(qPlN1#Nw)00W{oQTn!V@kiw<vdF9UQ6MJ-8tslJ$$$}iRZKLr0cPJ zF%7>Tn9^B=2T58ja_KSu;v!}`8<o(TxqEAx_oQ-$RN~sQ!`&IC%gs=W?cnh+olSm( z8x4^Xm*?-*TNAw#9KG`xCx$j%c;N4b&dF7onAdJcJlT79YTs(3Pr7j?MFw=CUWI+q zQ-K&Q-*`gzMhmHcH>5d-TjVRL#ZT)hwmes|qU%t|z6DxLfL%#yLFLK!p3*{FdFq+X zz&D{HeMRow`*&xgPwEO-=cVd*X5%iYl0%&zN%SETEnqHC8n8t}q)~We3)~e)vvor7 zU2Y!h_5h)ql|(_NV4MEi#sB&I|LW#fP5+<fuWAgvRKoIn_ZhmDfSsDRV~N;*idLuL z`9dc<Ad#@6Pv<4G0#Sus1U*j^WWr4tW!&V9VUk#pRfTnl#%5GuiC@RR4*jJ;kw|%_ z{f0#gxW2u5i8FBHmZU}W103itssvP~4$MSXTY>}+wGm&+DSxkEi4FgwqdLs<<MK`6 zZ0DqCf(A*l{CrhMf_<6sKbdNMvJkR-QVMO=gkb5iG^W05QD|##N251(TRq_o-*1o* zpf=dZfWsM5s2neiy!)M66#Bz}jGg(E=S1oh<PJ7M?#69yygkJIC_!RSbcjvaiN;+w zCcQigouqXtVPh13FHl>t?F@o!;A7Fwfm_p-s^{QA1qw_WG#1>-RR}uc)v*!OdY!3b zA8aJnPX;GdVH)`CJUSgsN5?~x;!Mm5wfB?YQe87MjM&-~Adm@PC_;4Tk3huxR1Sav zbrN6F<A7;ltxV$Y2QlamWr`gY!=9aT@)-#nI0$O`1VPfJ#iQ5%VnN}?nfDnrA$Gz^ zJa7XlK<WU$NZhqO=6M0?Cao=fa@1(Xy-Ds!OhSn=W7sTv-#@()e&EZW0t{)YecE^# zH6#N;?+8nSloJ~*21QzEEEp1Mc`5cZ%NB%VfiRfS9JRjB+~$?m(&G1i13^MXYuOZ} zFjO7tz7y;C2<n)NfKjG)!irfie$?s~3klB1pFDg=vJc3t=sDAF#uRE06Mw}ap+lMB z^nVOfX(w9dxrCwEV$g(N68Zq)kBT}QSDrue!u)u~LUk<Akqp?yM3|6%#~gkqo^X@^ zvb?Y$ww~5eggfeY0P?j>#Tcm@kuLkj*Qf#s2n`0FnQu#2mC1lCItxsEWy%J;4tRWi z+e@P`&XW4%7D|!k8h9X3K3}_6I3QcVIRU0;ue?gScQ*Zab1&m0NEond_C&y6C#Ca~ zA#Dms!zAf^5P~mqos=6S*_nNiPfwy!^}v7_#8S{X;>l-@Jl1Qtt}+sbUee~M{v>~~ zdx)2j;&21eNvdzFUN2vIKBVX920_jmcaQf24p&uiCHv5^A)C{?<lA!%ximlr>>&rQ z&#G)aZ!xNFtf}6D)vpeQWlV0_FP_5<uY5{M5^CzaTz3l>5B_r_g$spYc_J{#$pfoE zXvTv)*=N!;EL~vVNGz^sGaOF5W-M%YaX1Y+S<mJl^O@uMTu<?$S}rRJLqWlQz2IoD z9|fCCz$Qd=Uf0)sTKq{`I`Oxww>BG+*4qmwZ?i+}!`o||gacI2&}&^P-CH9>%H3at zK)7*-C!|YjBRl2Xnc?8r(BT7nbKyddwB~J)tI|{HR^-%BenBEgOtKn#NY%wlLJ1qF ztR4I4hd*u_ELW)nlY>K@!xt$}T%D6Qc)+X{mBHkLza;G#u<Ku$F{WZM`kEmy=?#YO z+ebxSJ>Susb9izZAj{J8RqLe<l^9*-kn)otJcN?^$<8*8xktMgR0>QD2VJPt%RC`x zipZPA04253T^F{xg%C?2aFOzRK1<-{n$+2lE(pD#Q}`9FF1KAFhXs;~n8fZ0w`s=* zm+-HrE6AHy8r>=a>#RL*^`vZQo!r}Wg$-P_svf-QeclL{8girnai6*tNB~9|I35y{ zF+$r@?eLdBwmGPP&IG<Z8uB(YWV#Y7^W0qr?77GVKX{BLTTtR$RGQhYusLA|qW3vg z*&uffS*Xt*BME{;h3arlg_m+XX5xqd#~ku4^t)q3ZB<`#o4_%XzGB|)%sE$PW*<0w zE|{^oMDtc`weA{J9cDhz5p2LZF@ne4<O1+z6eWSr1BSVUtUiOD;zc*mwqCMWWrK@b z6BSdAt&#OzE3d`?!nt>m@u*;^9!AG8jRk<pHHNPx(iv_yhb2F61bm(T&XYl2H0Njf z(?bXqhZgQh-99wBU1G?6oXjST3Ls#csAHTMp?OMv4KINhVH4HAd_ubZCZB^J1fLb> zSu<+=hAGOic}9XL6v3<y4vtR?A*Cf(sSS4{<?^bc&;~T8F@b#LxUXmwjyNqgCkTJX zWy+B)v_iWhVuSVLUs-M+It+v<S;d5Nnvx<4`7l!#rbo~%^NbUgx?3m2+0Jg(T$mb( ztS(X2&(Qpr))*s_(?oWKCbETKs8_kml0>0-Gn!iAv*^pbQLm?kj%@@`1^w-{MiHXu zw!Rrb9>$ImhGdQ&VzPxq+SKUzzKHex1vXowr+@NL-7L^{wQa5G_mLNYy(%FZ8W$^j z2b3)Lm|4iIn9pV}IaKyDUY)TXWL};g|LEO;?%l&x^Ow13&Nb!YF6d}5_ki>V5YOk? zPDR%A1A8QZpic)i5b9YjwP<Pwmf7Qtg_Whl#x~xJnpiYh`|NkWA?5m4h7CU&B!#I% zrEBX<%h6gK9W}AmOvWyc&@B@sxmhw!IKk#mO<Xdfs)0H<CS0S)*z)k#9ZpGz0wBzB zVp(+$+jOgUY=OMP-}=0lTQV1D`V16Y;b^)N=M-bFMYa=A1&w?kY6K4YL+Eo}@q>#` zl#3RR$DUUUfCD`P{i56-rTPJTe%=siL%M^9lpRf;^|#Mzn1Bk=`WW=(1yg{-6AtVx zumm1WK3cFXXfqg&P{f0(Zx>NgSO!hyZ&khoU1mQz*0Ii$F@IB)l64D~@cHhf7mL8b zF2gPdUkFeyp>dd~N|q1yGI8n;hk%0lMxMR=^=Nb@jDq<(f-S(XDq+mv*B{-7rS~#` zW-!)M3e;9{pOnl^(D!%Gcmny^>ML_VLlo;T+WL~JTrC4UZUS{0kkOV}V>&27Jq>mo zgNOKDi$Cva-%F0Divy(%TzZpPB6;J_6>G1?gujUJ`Mzy+u96J_VO$`2p1H@rsrKR_ zxTSeYj#J`&(X6r>nM#1!1xI~kkL5c`sbrAE!n=>ArEfg(^qJ`I;{lAD>0~m4%BSUo z6coT<c<RU^C5_$urE9+^0g(;8qg_A|xoQo6@(W<G>#-mc{g{FJzSk14)7o=?Ur4H^ zPdwD%UIsSpXN8WP7fcw5;;*r)K-_TU=#>eX$qe%c{DI0j-X;3X!>(QJuaX|wcpb=z zJ6&!XbyBV3l_sO^mN<36bA!PyMr?qR%ZIyEpBufsaOFzC63L_s)h;j|id3Btv*80G z#hkc53Ajf(0Coz|`Jld3rCuMvhQgEOAKZO1foIM@xs-BlNOAIBq~6$Hkplc+M!jbJ zV6W0WBUJkcfPC8jv-sd=8M{6qeGm@dHO<WzUwLUGwQmKek^>f;KNw`tp3u!BV7PK% zBedcU-xRYmxXCMTc9#&rhJ1V-r~sAx))64sS_u#7P^m=J&B5RZ|L4;&?X|(E6BG}C z3sb9q0x;FTk$OC-x?SYQ{-{xmdG@<FB^&ZbpR{CpUzkpbA={l4Raka%VOy$V%RnA3 zLDPx`nbkU!N3d;TWZ^g<TsRO6?k52uE~Ttq&!iL$pe*kt7n)LjSPPHN*QsKGzP=Az zE^OLl3K<1A>2b~F1GzatZvrpSD2vabXHkwJLOo3O&j}G~mn~8MEQLQ@^4V)JpV#_F zzdlMdNAwBmi=oWQ(P~zn+=Pog<^ars;fWrXGGNifJS~U=W%dHiaj^D;DOre0X@U#~ zG0hV&;jzTZHgFe|O_t8pTU~HxOD_dbk+}tytU}+QL^@~Sy{J&~TRP5C=LR2;h8^|N zuRuV?jeG8ZYFe8Jbv)_>A!j!|GAku0qsi}xMHc}zdVe4SQc&8xiB4D3SaiR&0eEv_ znUpwTYMmg|P#M1wjpiq}VjMqGhY8KS(*mKQ>~<iX4^bPOfEAB5Mw@4lDtu*7jk`b* zaN;+(FY*O9)_@Al)DX{SlRkzr;-%ZY{@^Zlr|}x}mvF$`P!E3f4~l&7kcU*8AN97& z4hER{J|)X{N2qgWaH{!JO;6*g!Rq=_KHQjoZMY3x2X0RR&A)d?3@J^uS9iV$CXCjj zJAgDrWN5?XP#b33QrCvqeo$HMgDLz>>r3fIWvZLgvj^;Oo6I(m->P|*eP$s5|3Lko zr)|z^O*pk?aB#@%+@<|;YOCqN6Q0&;vV3(!rdg${sUWfk+;_vjLfW}CM{NZZ0cYFW zf-J}08!m=u^$oWH1oF`q9ZKf&*EGr2S+Em43O5uf$^z=C3jvce?Kskzi_qz0p|8Bh zK)dzGE-CiVc|5BN-uc|K27JzqQdq*?F%|)x`7A++9a@2BMs&3(fO3?kQhS*AvTYlZ zFq(*-r*>q`%HgxRWpW5S*dY9hzFq<i_HKG!F)pH&Y(XZEQ}sJ?i`WU+i2;>c<y?-f z1j@}6tEGddhim~_8&g8!s^2i_^m0=-5!50`wpd5C4GgaY;Ej;jPPK*G;}M!H&8a?B zSZs1(ghVebztzh`p4KBWs|l$4+7SHNV)`@hb?~Nu8!@N<y=V6^1sE2ku4Wy1#a%rO zXMGx!SsnUeD9|pSKy(=?h@j05KEGf1YQu;@wSab!MYXRuOh^L~i}{;~Y`%c~p|iwl zBeZ<dFtBBieu0%pdb~glx2Fw21+`N<Y~J|2a1`sWXkpx+kFIb_7e9Snw(gfbykui! zF@4~>eNj73s#J4E*RDqz*{*4C!O)IU*0XxXFKo-gK3f0B3>kK}sRh0<$6uaI+*TSv zkod`u8-q4OXyo>ey~#7)w)?`h-}ehvw`YM_woVw8iW^A~97A0sO<J_ywxwOm5Xd5F z;SW=JHfip(Ic}g36r$1?u87)ruH@))!wxD^cIdm+BU9r;;_#^&Hm^mtVe%)Z<#}+I z4%t$Xl*8=6nzM)l?jI_cB`Y36?v^n~Z|U}C$4u-{773+SVcYL&D&N!>@B)jA_t8c= zn~c4A`_rGG@rhB#Hxow5<-R&gm_r*yL*DP5l18ox_^c@Dj^A-tDLo8VdoXc?yP1@6 zBAlqd8Bh`Sg;(C0Ie#PueO6K?_|yifGUdC|vRMK-OPOSzoNwlJBKB=+l`2-<Om#$5 z5?0=~zEw%^P1EEL1!^Nf?j&hw63vAn(^Wb3TaORtGR#AFr_YFc)Hf$GYi`QxY<Itj z^~u7x6i2xU6<<qc#$3}~?~b^2q0aVgTo@4;+m~c~6qu#Vh5M<Y_AYNB*9{lmPDf9K zmJU><hep^)K0`m^&gP>rDE9gRY2f89Yqp8G0!rEeiukqFBdA-PPSbqX5^|$-M2S1H z;!sX!yB?RXl%s#;@`L4{F=#PfQlD&E*>`H=yP>FymGsXh-Jjh8Ui?M`Wz+pe!fJ!& zWFJj>tR^>d<?fI(zIYWaCU{Rfr=JC}>_Yx)0M=GKxfA^}pd`qixAy!HTMezbNk?N4 zDf)aemMlM1PZ#i<BY>4gE7gKduEcWpD_YlWS*Fs%Ve~iz3HN7ilsPyT(7UiA%a6Qu zkd<DJ5a=&Dt8Q)gI(9=I_67W!RG%C#Vjmy869ttZL9`B}3O?M>fUWcluGHkQz{WUi z!)!<RN$eu6Z410(rIx~r(<db(l{ln+)E8%;DNpBK&_Vs;ZZ${-94A>nRr>6?If0IJ zYleF-)x~tqvl)^35%xOBQY@4!;1J&OdsHKP1HmR8ShjrcT_^A)aF{g}#c2TCx1|G3 z7h!|ZXtI2Tq{`4sKR1Z<cR9A;_d39-<5xVZMb?$t_q&76z&YxqG(9L7=ycdxAN4o| zBCcH_x`YOTQ}I7BKo7=CNpGoI;RSBTi^gHguYn!TD4QVN=3NXNQ((IZNjJuYKwC10 zTBYvK4S*xZD5K`Gb%vY`DS+igS22sH_XIdT<hOg5A#`#BsQ|4d?IRllPlHL|TsO+N z&T)NrNhkhFf|K{Hs60Nj7iWpr9m69d9j^*|$H?}pc+fy62K`7z(#?l+jueW$)RHTk z2AeY?L0t24E%lrs(S3w|)b7o>p>gnuH-R{)6#XV|idYg*wvo;7Qz+%T0ma_!Azx1X zx?ToNAeQZQd{#zuZ1@;da@2>bFEIg1z375FBu}g20XrWmWpHYK#sXJ|PnF3hfajGj zPp44pUpL?!D7+5xj4WpFceEg6dWo9UkUIoe{zDk)>yQBi4VbL@$z$FRGJpO!>#W#W z4Y+cO<8mDS1RPw0)VG?s6oi?t1P>M3MnKbRwkOUe&1yt|JKz0CrsFC=mHwBB@8e&B z*c@z`+P_tWP<V^699n_Szd5fQTV*u#90S=VscU`*zBUF(5|6HS3}nWDI#WsOUo|NJ zw)T_UwIuiLuL4vCH|pJyBV+WYP02dV6bc0dNj#=94f}a+U4@E_A^n69&@pChcsx}o z39<<3ZrjEmC1d;<C+6WiI#~)_^>?O?a-MAh&a@C|`O-{}2}b{ozS_l0z#CxlEx;EK z4Al#{Kfao-H?Np??Y9X552!!;)pl4YM2)Z!*8*1t6TeUEZvvB=4_6O*9E`y$M8xe; zn@FWA9lz%cFFye+g_*>D)6Q^#gt*Voo@`TFf(fIeV%YDd0G5gOFJgX@U-{+w^7_Ly z^(z&fgx40Pgg{KQ++;EzodV18{d@QOV|)Q!4ykjs3xwts+e5?5N8x~F+7w4-%X0zj zE6W=DCo4Pv%+t_6r<|eSoc-C+SX>scX8;Go%)j@f0x@Ikd#=P83PItW#d0M7V#hlH z=Z>g{iLiYET@faoq^hHCe8AJ$wDOpT2T34cgKy;LOfV2}L$ck{4#E6a_6Yc-6g~kd z6lR(bCKxLsMO=$qNwE99*2-{Ya55shTap;8{K{q3hnau<8*QBsH3lTTrUn#0o-1Ah zmU(BkIq1Q>?lBy=I-{8X7EKpEJP@o3AdE{qsl`CucWa(ze}CRWc2#_Sp7#BJ6K8Ua zBcn(R+8$&oK2uu<SoV|m9()<FivkKwuUdzgoDslDX(&;XFD3+-wa4AuCrtsG4X~5S zl=<78fmkg1h_IRFF5UzaoDe`zJ>-*$t{7gEzVJL4AY*LdVB-5lG;X&`f(RroVON<a zMMPOK>>RdyQSTC_JzaF2_#v^~eGUkgPt15hPK@hlLK(|TdmsBX^6gymqVPOdw8w~T zcFAXxMj5toVJ7}LlS6<s9}}M?eFs;6HuTtDY|!3k<DRZvH2R&*N`f=%#Ax6PG$k)H z*Jw>893O?Z>;86@iBLK1hd5&3uDsrJ3(ZX;00J?ADb()yWG#&GPas}|1^fs%k?om= zc57`01LN12)kxqga*hDOa+lYryr)^aap-rQXY69LUl|ao#pUoC*~X+vdH|<$BEXoJ z-TDPwI^X(bRs<0uipM(<ojvkhi;(7KCHzq~^Yt$z))3^IoDYX8g708oglrX7Twdcw z%BpWxk)D1LAP*uRYnk}sMH=}8o8UL)|M6=o;@ZD|O%<jJoo^QjKQ<Wd*&Is8#aGDM zlXd+GesAJIl}AfYzkvDC`oU>WxT@x%#got7M<*|sca6XMq}OSQ<FTwX)38_+y|c<5 z_Y#!dZc(+lGf{|M?G$xkUq5+0{w8)$$Zk*6^(X#bLu|BX@{Q9|lRw%E%VM`f{IkPi zzP9R5PqGx(K5UL+q1|-mbog?O<U`=SJf$Dr*Ez<uMe3AxN>t6tpFObJ?pkGZ);YLI z=@RMQsy3_^W7o}2LqBhm-u+pK#;w-;+3y}+jL6T7mY|~1Bc<Vs`~@Tk=?OyCFOwNs zyw=L$@y_{P+5%q^i*l6L78Cwhfj%AI`I9zTiC&CWowtAisFj$?!YwBYM{||=E?aI) z{LO!z+U8d8>;65roeK05k^BXY5N^b)9OW3Myx;e@8#7kzG?Mr_<p$>``+S%o##(XA zVc{fj<v7c%8&jGBwYtfmnCx*JdyRR^$@r_)OpUTsd#&yA8;^Lzrm6G}#|=Ne@H^I{ zH$QXAT9>t_KZ!cEcdqj|s_G?h)Kwl3UeMbv(D%Cyp-=X}(DyO~g`(=9?fC-?eHRX~ z#>^-rlVp&9(yyY;u=o%Qn(DH{W4n=uuV)=~;}g{jtk1G0tE1n&k~FaHOq+ZkEqXyZ zUKm)S-ONFcecb5%!D{(!(9}MTnL(b3o0<3|d6c6d@??y+ExbqxI{sk!+Cc2yH}P_X zBo8^)pZjyU<*qKSvl@@L8q40iDz~lWI1AU@JdJ**oJBigXWNVO;!!xhoKe{V;KD!} zn8*bi&R9A2v?uG*mC9yZXg17!Or6ul2@n!`$rgvs8Y(yQ`sJpU;~YtL%cjG;oC`XP zlem5ZazLYvd5A73i6&Lhu%va_Awe$ZJ3>`_2I+QZ`?^{2FMJ`?5<++N-s>2=;iEQT zTKZopP3$?)OU>u>I-5sG!Z_o$l<>fNX13mcT_v6Pk-kolwXn4!IC)|H{e|lC2Mx1( zmY*wx5Efqy1H&Nq6V3}1r#{JF0nU4{knoRKrUyVpU~cY}+Tm*3M4K6Xv#A_^Y2n<> z*D5sp;uzre_MBM_K*QZ&pRK)P|C%*_a*q4G$#!gaI@;O)<AYY)<sprkr3SOILNp9R z@8;Y-B{YtVw6Ojoaf(BfLbDkF)M$Fqw${Aj5BT-tMhxb~-RN?3zzz7Odg}<zmI<0F zG%$a*5DF8B!3(^Z4#bNGiS9d*&c6`I?zy~{<w<Ei?m0VyX}L<MVescw;{i(Ekn`by zlei)R$MAeiLMQS(Rb4*G!|CIfl%ocdGMmmN5~@=X+?8-$m2*|Xu>Lpa;ownrJII<M zUUw@veOD9M+CMEvs+vO_gRjSGZ}@jx-I|34ilj|@%yVGono<+=c5ZEt0gPUme`DX- zYRaDM@-kTHSI*v=o1FH~il8}BKE3;AIiszz*sn}G5G=J{iVCbAV6#B1dMVnb+2*gO zsZ!)Dyp`#vX`P8h7vdA|n%0kL%+GEm?`)W}W~}o55`nswps|Jvr%0%-_A-WOpz&?C zJG0@JEadDTInJ~vebS-q$kr%3jnjZL9s2>b7?)2!bQv`&jN6)y`jW?!yK5P`E?PQd zR|pku0>|dIg}KU;+!X5f+WkwM0hiLjv;m4yDxRS`_Xco&2*!q=qmc-Qk6(6^6&X%N zb~qY>+et88H#EgDKdKhy3AW1}kjO*@SFBv%eU$&`pk$0!@2C9d>ns298q42C`;WLa d>XP;W7Fjp<lDKqjB=~x!j)uYQx?2yT{|8lWv!MV0 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-gauge-derivative-output.png b/static/img/flux/0-x-prometheus-gauge-derivative-output.png new file mode 100644 index 0000000000000000000000000000000000000000..56147d94748c362a134ca75a006a4f475b494fee GIT binary patch literal 11626 zcmaia2RK|&*RB+zgp6KB8H_SI(M9y$61@a5MjyTRs2L%8jVK8sqQoG22^pOb2?jwV zO2jBZMnt=3@|FAF`+VQMo`*C0?6ucg@4Mc$&vE7?-7(anBxfNfA|j&H(N;GmBD#zP zeu+u10B4qK!v=r@bAX0rfQh$rK(K?K6OjtS8}0<r@pN!;GInx6g!&FU-6A5o!s}*g z8DMFkFYoB>DdIq|5ef110ag<c-BJqiad7l-3V^_!T->}Axpq5xxFBu_MJ@{|12F?1 zH78d$?Jz$llQ2V5$1o2^IRux|ZOE+<dBB0EQ-A{`#1rY|FCU`F_1CXF@R@L0lne6L zB)~(F>mNy38r*@XdHXp*WJJV;9mT}NATn|y2nV=>BOERSkr0y*7ZsBf6_*qi6O+Fw zCod@p`R5N85Y7+bEN`r?`Ojd$NRi7mAizgnR5Um^SS0wSh_|1MsJNV*oT!+DsDy+t zU?J=u>J{J+BJAbQ{VxydPX3O5Zax8S-d+%bM+dlfV1ObQkm^4$c>4U?t(X5lc>)*{ z4RP=h6&DdBVEUJ#fx-XV)YJ3d*8Ty;PX9aK|LEA?G}OmQ)Y!@2JJ8P&sGKu5A(W52 znxB(HfVZEiw>R=%G~RLb4)FGO_4a{CNQg*5_zfH!-Mk2AV1Jhw7|82*`3E?7IXda6 zD{=u&MBLmE^3pfeB*Y}eRK(@fB*n!w)KuieWmP4`#H3}!)MUkEHU70$-P<wH)5$B~ zUuzM-T5%OwX(>5L32`~ioBwewK@OfiKxB0%Ker$!gr=XjC*&_`dAI+bi|l{T<sWMi z{~?!u;*k5VYej)%L<zP1AGQA1DL_DkkN=h~F!;CloxA|W`vKCfI^b0SI)><uzNrQ@ ztVpPGrnIb9xN1(gW)TA6XJg|LX;`IZ=4RHg7AWX%?Hnj9uGG{teAC)j^z0RzRX}}H zH!P<&GpD$tdk7l!T%c%}-8NLD{%dYQ8E<0E%bGWL?pi^d;_A?yHTCUDDLH&eXbA~< zv95jbw|KGkoyL~8iKq-(sCac<YedvTPS3|GDmqqHaK4l#GjlsRc@-%sMTmP6EvGOG z3m4CW7u-PwU;`%|U1JduDbeQ5)Ql&Jw>6nn%nS_7`P174OW)tKbGEsMV3gBix_vh! zEKczGB!@#3h>nc|5gQ%zh(TP%FCanyCNBEsyZwDvgp(KRU3bw|oLDPPr0xrsPsV+? z8x1>*KdXygSds5>Gc3DDpm?<WC0eX=kImc%tn0vP>iPV|Yo7R5k<qB;ws$VBzDx=R zT>jbFd8IzSVU@3%=mccB0&)X_qQyG)f<j`1%0DtlX(GLXd15P*lC!;iLPZ<bJ-tJi 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 acD`bEx}+oxEg`)9tfOJ5UZ;9L_J0AH8ch%Y literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-gauge-input.png b/static/img/flux/0-x-prometheus-gauge-input.png new file mode 100644 index 0000000000000000000000000000000000000000..81681267f169bce546e4045b51d06e54076e5014 GIT binary patch literal 10838 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 SpX2}2Q%~DSt6CEh^S=P?2@TEw literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-histogram-multiple-quantiles.png b/static/img/flux/0-x-prometheus-histogram-multiple-quantiles.png new file mode 100644 index 0000000000000000000000000000000000000000..116aa44235fe181a4b34f1e7d4100aaf4a646b05 GIT binary patch literal 22451 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-histogram-quantile.png b/static/img/flux/0-x-prometheus-histogram-quantile.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe45e8243b59634875ba6c11e79448ab947a48b GIT binary patch literal 16141 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 literal 0 HcmV?d00001 diff --git a/static/img/flux/0-x-prometheus-summary-quantiles.png b/static/img/flux/0-x-prometheus-summary-quantiles.png new file mode 100644 index 0000000000000000000000000000000000000000..833c73bc4bdf53fa0dd3a93a63e253d991937a19 GIT binary patch literal 19016 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 L`njxgN@xNA$-NS1 literal 0 HcmV?d00001