diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1e8e3612..70a1bb08 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -461,7 +461,7 @@ pages: # only update on designated, stable branch - develop - doc-release-branch - - joes-ts-wip + - joes-new-ts-wip # Publish docs to clouddocs.f5.com publish_docs_to_production: @@ -478,6 +478,6 @@ publish_docs_to_production: script: # Uncomment and set to create desired version format - aws s3 sync docs/_build/html s3://clouddocs.f5.com/products/extensions/f5-telemetry-streaming/latest - # - aws s3 cp versions.json s3://clouddocs.f5.com/products/extensions/f5-telemetry-streaming/versions.json + - aws s3 cp versions.json s3://clouddocs.f5.com/products/extensions/f5-telemetry-streaming/versions.json # create invalidation to clear cloudfront cache - aws cloudfront create-invalidation --distribution-id $AWS_DIST --paths /products/extensions/f5-telemetry-streaming/latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b654967..b9c555f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,22 @@ # Changelog Changes to this project are documented in this file. More detail and links can be found in the Telemetry Streaming [Document Revision History](https://clouddocs.f5.com/products/extensions/f5-telemetry-streaming/latest/revision-history.html). +## 1.22.0 +### Added +- AUTOTOOL-622: [GitHub #94](https://github.com/F5Networks/f5-telemetry-streaming/issues/94): Add Data Dog consumer (experimental feature) +- AUTOTOOL-2600: [GitHub #125](https://github.com/F5Networks/f5-telemetry-streaming/issues/125): Added "slowKilled" and "evictedConns" properties to "clientside" of virtual servers +- AUTOTOOL-2605: [GitHub #141](https://github.com/F5Networks/f5-telemetry-streaming/issues/141): Add "eventSchemaVersion" property to F5_Cloud consumer +- AUTOTOOL-2453: [GitHub #143](https://github.com/F5Networks/f5-telemetry-streaming/issues/143): Add new Google Cloud Logging consumer +- AUTOTOOL-2623: Added new property "reportInstanceMetadata" to "Google_Cloud_Monitoring" consumer to control metadata reporting +### Fixed +- AUTOTOOL-2543: [GitHub #134](https://github.com/F5Networks/f5-telemetry-streaming/issues/134): Fixed issue where Prometheus consumer encounters an error when a metric name is registered more than once +- AUTOTOOL-2591: Fixed issue where the Kafka Consumer would create a new Kafka connection on each Telemetry Streaming payload +### Changed +- AUTOTOOL-2411: The default namespace (f5telemetry_default) is now stated explicitly in traceName and paths of the to the trace files. +- AUTOTOOL-2573: Google Cloud Monitoring Consumer now uses instance_id and zone as time-series resource labels for BIG-IPs that run in Google Cloud +- AUTOTOOL-2613: Update npm packages (@grpc/grpc-js from v1.3.0 to v1.3.4, aws-sdk from v2.914.0 to v2.943.0, statsd-client from v0.4.6 to v0.4.7) +### Removed + ## 1.21.0 ### Added - AUTOTOOL-2555: Add new property "addTags" to StatsD consumer that makes Consumer to send tags along with metrics (experimental feature) @@ -10,6 +26,7 @@ Changes to this project are documented in this file. More detail and links can b - AUTOTOOL-2510: Update npm packages (@f5devcentral/f5-teem from v1.4.6 to v1.5.0, aws-sdk from v2.885.0 to v2.914.0, mustache from v4.1.0 to v4.2.0, statsd-client from v0.4.5 to v0.4.6) - Replace grpc-js-0.2-modified with @grpc/grpc-js - AUTOTOOL-2535: Refactor Google Cloud (used by the Google Cloud Monitoring Consumer) authentication, and add support for caching short-lived authentication tokens +### Removed ## 1.20.1 ### Added diff --git a/SUPPORT.md b/SUPPORT.md index d16a7478..c133a499 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -17,10 +17,10 @@ Currently supported versions: | Software Version | Release Type | First Customer Ship | End of Support | |------------------|---------------|---------------------|-----------------| -| TS 1.19.0 | Feature | 06-Apr-2021 | 06-Jul-2021 | | TS 1.20.0 | Feature | 18-May-2021 | 18-Aug-2021 | | TS 1.20.1 | LTS | 30-Jun-2021 | 30-Jun-2022 | | TS 1.21.0 | Feature | 28-Jun-2021 | 28-Sep-2021 | +| TS 1.22.0 | Feature | 09-Aug-2021 | 09-Nov-2021 | Versions no longer supported: @@ -44,5 +44,6 @@ Versions no longer supported: | TS 1.16.0 | Feature | 20-Nov-2020 | 20-Feb-2021 | | TS 1.17.0 | Feature | 12-Jan-2021 | 12-Apr-2021 | | TS 1.18.0 | Feature | 23-Feb-2021 | 23-May-2021 | +| TS 1.19.0 | Feature | 06-Apr-2021 | 06-Jul-2021 | See the [Release notes](https://github.com/F5Networks/f5-telemetry-streaming/releases) and [Telemetry Streaming documentation](https://clouddocs.f5.com/products/extensions/f5-telemetry-streaming/latest/revision-history.html) for new features and issues resolved for each release. diff --git a/contributing/README.md b/contributing/README.md index 54d152a1..a63fab34 100644 --- a/contributing/README.md +++ b/contributing/README.md @@ -108,7 +108,7 @@ How does the project handle a typical `POST` request? "trace": false, "format": "default" }, - "schemaVersion": "1.21.0" + "schemaVersion": "1.22.0" } } ``` diff --git a/contributing/process_release.md b/contributing/process_release.md index ffde7685..30c1aabd 100644 --- a/contributing/process_release.md +++ b/contributing/process_release.md @@ -56,6 +56,7 @@ * 1.19.0 - 14.1 MB * 1.20.0 - 14.4 MB * 1.21.0 - 15.5 MB + * 1.22.0 - 15.6 MB * Install build to BIG-IP, navigate to folder `/var/config/rest/iapps/f5-telemetry/` and check following: * Run `du -sh` and check that folder's size (shouldn't be much greater than previous versions): * 1.4.0 - 65 MB @@ -74,9 +75,10 @@ * 1.17.0 - 95 MB (NOTE: grpc module deps increase) * 1.18.0 - 100 MB * 1.19.0 - 101 MB - * 1.20.0 - 103MB - * 1.21.0 - 111MB - * Check `nodejs/node_modules` folder - if you see `eslint`, `mocha` or something else from [package.json](package.json) `devDependencies` section - something wrong with build process. Probably some `npm` flags are work as not expected and it MUST BE FIXED before publishing. + * 1.20.0 - 103 MB + * 1.21.0 - 111 MB + * 1.22.0 - 112 MB + * Check `node_modules` folder - if you see `eslint`, `mocha` or something else from [package.json](package.json) `devDependencies` section - something wrong with build process. Probably some `npm` flags are work as not expected and it MUST BE FIXED before publishing. * Ensure that all tests (unit tests and functional tests passed) * Optional: Ensure that your local tags match remote. If not, remove all and re-fetch: * git tag -l -n @@ -92,6 +94,17 @@ * push the new build artifacts to the 'f5-automation-toolchain-generic/f5-telemetry' Artifactory repository * send the release candidate email with features, bugs, artifactory URL +## LTS Release process (developers only) + +Following list of changes should be done for both master/develop and LTS branches: + +* Update [SUPPORT.md](SUPPORT.md) - set release type "LTS" and update support dates for LTS release +* Update [CHANGELOG.md](CHANGELOG.md) - add *Promoted to LTS* to **Changed** section +* Schema changes: + * Create new folder for LTS version (with name X.Y.Z) in [src/schema](src/schema) + * All schemas that are "newer" than LTS release should be updated to support LTS version. Update *base_schema.json* file only for each applicable version + * **LTS branch only** - update [src/schema/latest](src/schema/latest) to match LTS schema + ## Release process * Create new branch from `master`, e.g. `rc-master-branch`. It will be easier to merge branches and resolve conflicts without any following up issues. diff --git a/docs/conf.py b/docs/conf.py index 1c6a2ea6..aa809f9c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,6 +21,7 @@ sys.path.insert(0, os.path.abspath('.')) import f5_sphinx_theme +import re # -- General configuration ------------------------------------------------ @@ -78,7 +79,7 @@ # The short X.Y version. version = u'' # The full version, including alpha/beta/rc tags. -release = u'1.21.0' +release = u'1.22.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -154,13 +155,14 @@ html_theme = 'f5_sphinx_theme' html_theme_path = f5_sphinx_theme.get_html_theme_path() html_theme_options = { - 'next_prev_link': True + 'next_prev_link': True, + 'version_selector': True } -# html_context = { -# 'version_meta_path': '/products/extensions/f5-telemetry-streaming/versions.json', -# 'project_safe': re.sub('[^A-Za-z0-9]+', '', project) -# } +html_context = { +'version_meta_path': '/products/extensions/f5-telemetry-streaming/versions.json', +'project_safe': re.sub('[^A-Za-z0-9]+', '', project) +} # Theme options are theme-specific and customize the look and feel of a theme diff --git a/docs/custom-endpoints.rst b/docs/custom-endpoints.rst index f9c39353..8e4d944c 100644 --- a/docs/custom-endpoints.rst +++ b/docs/custom-endpoints.rst @@ -93,7 +93,7 @@ In order to have hostname information available in the data sent to your consume Creating System Pollers specific to the custom endpoint ------------------------------------------------------- -Because you might want to specify different polling intervals for the custom endpoints, v1.10.0 also enables the ability to create an system poller specific to an endpoint or array of endpoints. To do this, you use the new **endpointList** property in your system poller definition. +Because you may want to specify different polling intervals for the custom endpoints, v1.10.0 also enables the ability to create an system poller specific to an endpoint or array of endpoints. To do this, you use the new **endpointList** property in your system poller definition. EndpointList is simply a list of endpoints to use in data collection, and can include the following types: diff --git a/docs/declarations.rst b/docs/declarations.rst index a9114e1a..e6bf89f9 100644 --- a/docs/declarations.rst +++ b/docs/declarations.rst @@ -233,8 +233,118 @@ Customizing the Generic HTTP consumer payload | +.. _addtagex: +Using the addTags property for the StatsD consumer +-------------------------------------------------- +.. IMPORTANT:: The addTags property is available in TS v1.21.0 and later. See :ref:`StatsD addTags` for more information on this feature. +The following example shows a declaration with a systemPoller, a Listener, and a StatsD consumer with **addTags** using the **sibling** method. + +.. code-block:: json + + { + "class": "Telemetry", + "My_System": { + "class": "Telemetry_System", + "systemPoller": { + "interval": 60 + } + }, + "My_Consumer_with_AutoTagging": { + "class": "Telemetry_Consumer", + "type": "Statsd", + "host": "192.0.2.1", + "protocol": "udp", + "port": 8125, + "addTags": { + "method": "sibling" + } + } + } + +| + +Next, we show the output from the System poller: + +.. code-block:: json + + { + "pools": { + "/Common/app.app/app_pool": { + "activeMemberCnt": 0, + "serverside.bitsIn": 0, + "serverside.bitsOut": 0, + "serverside.curConns": 0, + "serverside.maxConns": 0, + "serverside.pktsIn": 0, + "serverside.pktsOut": 0, + "serverside.totConns": 0, + "availabilityState": "available", + "enabledState": "enabled", + "status.statusReason": "The pool is available", + "name": "/Common/app.app/app_pool", + "members": { + "/Common/10.0.3.5:80": { + "addr": "10.0.3.5", + "monitorStatus": "up", + "port": 0, + "serverside.bitsIn": 0, + "serverside.bitsOut": 0, + "serverside.curConns": 0, + "serverside.maxConns": 0, + "serverside.pktsIn": 0, + "serverside.pktsOut": 0, + "serverside.totConns": 0, + "availabilityState": "available", + "enabledState": "enabled", + "status.statusReason": "Pool member is available" + } + }, + "tenant": "Common", + "application": "app.app" + } + } + } + +| + +Without the **addTags** property, the StatsD consumer sends only numeric metrics like **serverside.bitsIn** and so on. + +With the **addTags** property, the StatsD consumer also sends numeric metrics but also sends the following tags along with each metric + +- For nested metrics under **pools.-Common-app.app-app_pool**, it sends following tags: + + .. code-block:: json + + { + "availabilityState": "available", + "enabledState": "enabled", + "status.statusReason": "The pool is available", + "name": "/Common/app.app/app_pool", + "tenant": "Common", + "application": "app.app" + } + + +- For nested metrics under **pools.-Common-app.app-app_pool.memebers.-Common-10-0-3-5-80**, it sends following tags: + + .. code-block:: json + + { + "addr": "10.0.3.5", + "monitorStatus": "up", + "availabilityState": "available", + "enabledState": "enabled", + "status.statusReason": "Pool member is available" + } + + +| + +:ref:`Back to top` + +| diff --git a/docs/index.rst b/docs/index.rst index 75f527a0..523efe1d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ F5 Telemetry Streaming Welcome to the F5 Telemetry Streaming User Guide. To provide feedback on this documentation, you can file a GitHub Issue, or email us at solutionsfeedback@f5.com. |br| -For information on supported versions of Telemetry Streaming, see |supportmd|. +.. IMPORTANT:: This the documentation for the **latest** version of Telemetry Streaming, if you want to see the documentation for a long term support (LTS) version, use the version selector on the top left (for details, see |supportmd|). Introduction ------------ diff --git a/docs/output-example.rst b/docs/output-example.rst index 4fb11733..e00148ba 100644 --- a/docs/output-example.rst +++ b/docs/output-example.rst @@ -15,7 +15,7 @@ The following shows the system information that Telemetry Streaming collects. .. NOTE:: For some of the output to appear, you must have the applicable BIG-IP module licensed and provisioned (for example, you must have BIG-IP DNS provisioned to get GSLB wide IP and Pool information). -Telemetry Streaming 1.17 introduced additional pool and virtual server output, such as virtual server **clientside.pktsIn** and pools **serverside.totConns**. These do not appear in earlier versions. +Telemetry Streaming 1.22 introduced additional virtual server output: **clientside.slowKilled** and **clientside.evictedConns**. These do not appear in earlier versions. .. literalinclude:: ../examples/output/system_poller/output.json :language: json diff --git a/docs/rest-api-endpoints.rst b/docs/rest-api-endpoints.rst index 22b1fdb1..283b313d 100644 --- a/docs/rest-api-endpoints.rst +++ b/docs/rest-api-endpoints.rst @@ -24,7 +24,7 @@ Response ```````` Response is valid JSON data. When the response is HTTP 200 -When the response code is other than 2xx, then the response body in general will look like the following object: +When the response code is other than 2xx, the response body typically looks like the following object: .. code-block:: bash diff --git a/docs/revision-history.rst b/docs/revision-history.rst index c85c4ad6..2f1d61d7 100644 --- a/docs/revision-history.rst +++ b/docs/revision-history.rst @@ -11,13 +11,16 @@ Document Revision History - Description - Date - * - 1.21.0 - - Updated the documentation for Telemetry Streaming v1.21.0. This release contains the following changes: |br| * An **experimental** property for the StatsD consumer (see :ref:`StatsD addTags`) |br| * A number of minor bug fixes, stability enhancements, and foundational elements for some upcoming features. - - 6-28-21 - + * - 1.22.0 + - Updated the documentation for Telemetry Streaming v1.22.0. This release contains the following changes: |br| * Added **clientside.slowKilled** and **clientside.evictedConns** to virtual server output (see :ref:`System information output`) |br| |br| Issues Resolved: |br| * Fixed issue where Prometheus consumer encounters an error when a metric name is registered more than once, `GitHub #134 `_ |br| * Fixed issue where the Kafka Consumer would create a new Kafka connection on each Telemetry Streaming payload |br| * Google Cloud Monitoring Consumer now uses instance_id and zone as time-series resource labels for BIG-IPs that run in Google Cloud + - 8-9-21 + + * - 1.20.1 + - Released Telemetry Streaming v1.20.1 as a LTS (Long Term Support) version. See the Telemetry Streaming |supportmd| for information about the Telemetry Streaming support policy. + - 6-30-21 * - 1.21.0 - - Updated the documentation for Telemetry Streaming v1.21.0. This release contains a number of minor bug fixes, stability enhancements, and foundational elements for some upcoming features. + - Updated the documentation for Telemetry Streaming v1.21.0. This release contains the following changes: |br| * An **experimental** property for the StatsD consumer (see :ref:`StatsD addTags`) |br| * A number of minor bug fixes, stability enhancements, and foundational elements for some upcoming features. - 6-28-21 * - 1.20.0 @@ -131,4 +134,8 @@ Document Revision History .. |schemalink| raw:: html - schema files \ No newline at end of file + schema files + +.. |supportmd| raw:: html + + Support information on GitHub \ No newline at end of file diff --git a/docs/setting-up-consumer.rst b/docs/setting-up-consumer.rst index ed65877e..c2bf2296 100644 --- a/docs/setting-up-consumer.rst +++ b/docs/setting-up-consumer.rst @@ -456,13 +456,15 @@ addTags (experimental) `````````````````````` .. sidebar:: :fonticon:`fa fa-info-circle fa-lg` Version Notice: - The EXPERIMENTAL feature addTags for StatsD is available in Telemetry Streaming 1.20 and later. + The EXPERIMENTAL feature addTags for StatsD is available in Telemetry Streaming 1.21 and later. -Telemetry Streaming 1.20 adds a new property for the StatsD consumer: **addTags**. This feature causes TS to parse the incoming payload for values to automatically add as tags. Currently only the **sibling** method is supported. +Telemetry Streaming 1.21 adds a new property for the StatsD consumer: **addTags**. This feature causes TS to parse the incoming payload for values to automatically add as tags. Currently only the **sibling** method is supported. + +To see an example and the output from **addTags**, see :ref:`addTags example`. | -Example Declaration (updated with the **experimental** feature *addTags* introduced in TS 1.20 (see below). If using a prior version, **remove** the highlighted lines, and the comma in line 9): +Example Declaration (updated with the **experimental** feature *addTags* introduced in TS 1.21. If using a prior version, **remove** the highlighted lines, and the comma in line 9): .. literalinclude:: ../examples/declarations/statsd.json :language: json diff --git a/examples/declarations/data_dog.json b/examples/declarations/data_dog.json new file mode 100644 index 00000000..717e4f68 --- /dev/null +++ b/examples/declarations/data_dog.json @@ -0,0 +1,8 @@ +{ + "class": "Telemetry", + "My_Consumer": { + "class": "Telemetry_Consumer", + "type": "DataDog", + "apiKey": "api_key" + } +} diff --git a/examples/declarations/f5_cloud.json b/examples/declarations/f5_cloud.json index 4cc43240..177b551c 100644 --- a/examples/declarations/f5_cloud.json +++ b/examples/declarations/f5_cloud.json @@ -90,7 +90,8 @@ "authProviderX509CertUrl": "https://www.googleapis.com/oauth2/v1/certs", "clientX509CertUrl": "https://www.googleapis.com/robot/v1/metadata/x509/test%40deos-dev.iam.gserviceaccount.com" }, - "targetAudience": "deos-ingest" + "targetAudience": "deos-ingest", + "eventSchemaVersion": "5" }, "schemaVersion": "1.15.0" } diff --git a/examples/declarations/google_cloud_logging.json b/examples/declarations/google_cloud_logging.json new file mode 100644 index 00000000..067ca239 --- /dev/null +++ b/examples/declarations/google_cloud_logging.json @@ -0,0 +1,15 @@ +{ + "class": "Telemetry", + "My_Consumer": { + "class": "Telemetry_Consumer", + "type": "Google_Cloud_Logging", + "logScope": "projects", + "logScopeId": "yourProjectId", + "logId": "yourLogId", + "privateKey": { + "cipherText": "yourPrivateKey" + }, + "privateKeyId": "yourPrivateKeyId", + "serviceEmail": "yourServiceEmail" + } +} diff --git a/examples/declarations/google_cloud_monitoring.json b/examples/declarations/google_cloud_monitoring.json index 06296707..b2f6fdff 100644 --- a/examples/declarations/google_cloud_monitoring.json +++ b/examples/declarations/google_cloud_monitoring.json @@ -8,6 +8,7 @@ }, "projectId": "yourGoogleCloudMonitoringProjectId", "privateKeyId": "yourPrivateKeyId", - "serviceEmail": "yourServiceEmail" + "serviceEmail": "yourServiceEmail", + "reportInstanceMetadata": false } } diff --git a/examples/output/system_poller/output.json b/examples/output/system_poller/output.json index 748a60f9..32de61b6 100644 --- a/examples/output/system_poller/output.json +++ b/examples/output/system_poller/output.json @@ -288,9 +288,11 @@ "clientside.bitsIn": 0, "clientside.bitsOut": 0, "clientside.curConns": 0, + "clientside.evictedConns": 0, "clientside.maxConns": 0, "clientside.pktsIn": 0, "clientside.pktsOut": 0, + "clientside.slowKilled": 0, "clientside.totConns": 0, "destination": "10.5.6.7:80", "availabilityState": "offline", @@ -320,9 +322,11 @@ "clientside.bitsIn": 0, "clientside.bitsOut": 0, "clientside.curConns": 0, + "clientside.evictedConns": 0, "clientside.maxConns": 0, "clientside.pktsIn": 0, "clientside.pktsOut": 0, + "clientside.slowKilled": 0, "clientside.totConns": 0, "destination": "192.0.2.11:443", "availabilityState": "offline", @@ -340,9 +344,11 @@ "clientside.bitsIn": 0, "clientside.bitsOut": 0, "clientside.curConns": 0, + "clientside.evictedConns": 0, "clientside.maxConns": 0, "clientside.pktsIn": 0, "clientside.pktsOut": 0, + "clientside.slowKilled": 0, "clientside.totConns": 0, "destination": "192.0.2.11:80", "availabilityState": "unknown", diff --git a/package-lock.json b/package-lock.json index a1252504..4e2bb674 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "f5-telemetry", - "version": "1.21.0-1", + "version": "1.22.0-1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -139,17 +139,17 @@ } }, "@grpc/grpc-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.0.tgz", - "integrity": "sha512-fiL7ZaGg2HBiFtmv6m34d5jEgEtNXfctjzB3f7b3iuT7olBX4mHLMOqOBmGTTSOTfNRQJH5+vsyk6mEz3I0Q7Q==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.4.tgz", + "integrity": "sha512-AxtZcm0mArQhY9z8T3TynCYVEaSKxNCa9mVhVwBCUnsuUEe8Zn94bPYYKVQSLt+hJJ1y0ukr3mUvtWfcATL/IQ==", "requires": { "@types/node": ">=12.12.47" }, "dependencies": { "@types/node": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz", - "integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==" + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", + "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==" } } }, @@ -264,12 +264,6 @@ "@types/node": "*" } }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, "@types/lodash": { "version": "4.14.170", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", @@ -306,9 +300,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "agent-base": { @@ -521,9 +515,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sdk": { - "version": "2.914.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.914.0.tgz", - "integrity": "sha512-N7UZBvTMPr+lqlOmd/vZ6NMMaw1K2Y94fq3b6roZWouUQgn5unEixVpCuRhcYleOPSnikSCIrrDs2AXq5bXhLg==", + "version": "2.943.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.943.0.tgz", + "integrity": "sha512-1/WDupJrIB0SJEzIOf+UpqmG0AP5AXoDXhbW7CEujHerOd+/b5A1ubeHKGQJvBN4tAktgsvGpDiBRfB9MpJU5g==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -1353,9 +1347,9 @@ } }, "eslint-plugin-import": { - "version": "2.23.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.3.tgz", - "integrity": "sha512-wDxdYbSB55F7T5CC7ucDjY641VvKmlRwT0Vxh7PkY1mI4rclVRFWYfsrjDgZvwYYDZ5ee0ZtfFKXowWjqvEoRQ==", + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", "dev": true, "requires": { "array-includes": "^3.1.3", @@ -2559,12 +2553,12 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "jsonwebtoken": { @@ -3635,15 +3629,14 @@ } }, "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "object.getownpropertydescriptors": { @@ -3658,15 +3651,14 @@ } }, "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "once": { @@ -4415,9 +4407,9 @@ "dev": true }, "statsd-client": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/statsd-client/-/statsd-client-0.4.6.tgz", - "integrity": "sha512-OL3PAf0LhlFP8ZpxFm3Ue7dL3cV5o7PAsWDsQnx/iKXGVr8huYF/ui+OZEORerEDVRps7BCPAq5bWppMj1oMoA==" + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/statsd-client/-/statsd-client-0.4.7.tgz", + "integrity": "sha512-+sGCE6FednJ/vI7vywErOg/mhVqmf6Zlktz7cdGRnF/cQWXD9ifMgtqU1CIIXmhSwm11SCk4zDN+bwNCvIR/Kg==" }, "streamsearch": { "version": "0.1.2", @@ -4746,13 +4738,12 @@ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.0", "minimist": "^1.2.0", "strip-bom": "^3.0.0" } diff --git a/package.json b/package.json index ccfd2cfc..e1dfa43d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "f5-telemetry", - "version": "1.21.0-1", + "version": "1.22.0-1", "author": "F5 Networks", "license": "Apache-2.0", "repository": { @@ -35,12 +35,12 @@ }, "dependencies": { "@f5devcentral/f5-teem": "^1.5.0", - "@grpc/grpc-js": "^1.3.0", + "@grpc/grpc-js": "^1.3.4", "@grpc/proto-loader": "~0.3.0", "ajv": "^6.12.6", "ajv-keywords": "^3.5.2", "applicationinsights": "^1.8.10", - "aws-sdk": "^2.914.0", + "aws-sdk": "^2.943.0", "commander": "^2.20.3", "deep-diff": "^1.0.2", "eventemitter2": "^6.4.4", @@ -54,7 +54,7 @@ "mustache": "^4.2.0", "prom-client": "11.0.0", "request": "^2.88.2", - "statsd-client": "^0.4.6", + "statsd-client": "^0.4.7", "tiny-request-router": "^1.2.2", "uuid": "^3.4.0" }, @@ -85,6 +85,7 @@ "dependencies": { "@grpc/proto-loader": "v0.3.0 - This package is used for GRPC connection, supports node v6 and above.", "ajv": "This package dropped support for older node versions and requires the ajv package to be recompiled. Use v6.X.Y for Node v4.", + "ajv-keywords": "This package documents that v3 should be used when using ajv v6", "applicationinsights": "This package requires Node v8 in 2.0.0+ as it now includes OpenTelemetry packages. Use v1.X.Y for Node v4.", "commander": "This package dropped support for older node versions. Use v2.X.Y for Node v4.", "google-auth-library": "This package is used for GRPC connection, supports node v10 and above, but fromJSON function works in node v8.11.1 - should use v6.1.X only", @@ -110,6 +111,7 @@ "nock": "This package dropped support for older node versions. Use v10.0.0 for Node v4.", "nyc": "This package dropped support for older node versions. Use v14.X.Y for Node v4.", "sinon": "This package dropped support for older node versions. Use v7.X.Y for Node v4.", + "ssh2": "This packaged dropped support for older node versions. Use v0.X.Y for Node >= v5.2 and <= v10.16", "winston": "This package dropped support for older node versions. Use v2.X.Y for Node v4." } } diff --git a/src/lib/consumers/DataDog/index.js b/src/lib/consumers/DataDog/index.js new file mode 100644 index 00000000..69b637b3 --- /dev/null +++ b/src/lib/consumers/DataDog/index.js @@ -0,0 +1,160 @@ +/* + * Copyright 2021. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ +/** + * THIS IS EXPERIMENTAL VERSION OF DATA DOG CONSUMER. IT MIGHT CRASH, + * WORK NOT AS YOU EXPECTING AND SUBJECT TO CHANGE IN A FUTURE + */ + +'use strict'; + +const DEFAULT_HOSTNAME = require('../../constants').DEFAULT_HOSTNAME; +const EVENT_TYPES = require('../../constants').EVENT_TYPES; +const metricsUtil = require('../shared/metricsUtil'); +const requestsUtil = require('../../utils/requests'); + + +const DATA_DOG_LOGS_GATEWAY = 'https://http-intake.logs.datadoghq.com/v1/input'; +const DATA_DOG_METRICS_GATEWAY = 'https://api.datadoghq.com/api/v1/series'; +const DATA_DOG_SERVICE_FIELD = 'f5-telemetry'; +const DATA_DOG_METRIC_TYPE = 'gauge'; + +/** + * See {@link ../README.md#context} for documentation + */ +module.exports = function (context) { + /** + * Links for more info: + * - https://docs.datadoghq.com/developers/guide/what-best-practices-are-recommended-for-naming-metrics-and-tags/ + * - https://docs.datadoghq.com/api/latest/logs/#send-logs + * - https://docs.datadoghq.com/api/latest/metrics/#submit-metrics + */ + const data = context.event.data; + const eventType = context.event.type; + const hostname = (data.system && data.system.hostname) || data.hostname || DEFAULT_HOSTNAME; + const interval = (data.telemetryServiceInfo && data.telemetryServiceInfo.pollingInterval) || undefined; + // for now use current time, ideally should try to fetch it from event data + const timestamp = Date.now() / 1000; + + let ddData; + let ddType; + + if (eventType === EVENT_TYPES.EVENT_LISTENER || eventType === EVENT_TYPES.SYSLOG_EVENT) { + ddType = 'log'; + ddData = { + ddsource: context.event.type, + // usually there is nothing along this data that can be used as a tag + ddtags: buildTags({ telemetryEventCategory: eventType }, true), + hostname, + message: data.data, + service: DATA_DOG_SERVICE_FIELD + }; + } else { + ddType = 'metrics'; + ddData = { + series: [] + }; + metricsUtil.findMetricsAndTags(data, { + collectTags: true, + excludeNameFromPath: true, + parseMetrics: true, + onMetric: (metricPath, metricValue, metricTags) => { + // ignore timestamps and intervals + if (metricPath[metricPath.length - 1].indexOf('imestamp') === -1 + && metricPath[metricPath.length - 1].indexOf('nterval') === -1) { + ddData.series.push({ + host: hostname, + interval, + metric: buildMetricName(metricPath), + points: [[timestamp, metricValue]], + tags: buildTags(metricTags), + type: DATA_DOG_METRIC_TYPE + }); + } + } + }); + if (ddData.series.length === 0) { + ddData = null; + } + } + if (!ddData) { + /** + * Looks like no metrics were found, then let's + * transform this event into log message and attach + * all possible tags to it + */ + let ddtags = { telemetryEventCategory: eventType }; + metricsUtil.findMetricsAndTags(data, { + collectTags: true, + maxDepth: 1, + onTags: (metricPath, metricTags) => { + ddtags = Object.assign(ddtags, metricTags); + } + }); + + ddType = 'log'; + ddData = { + ddsource: context.event.type, + ddtags: buildTags(ddtags, true), + hostname, + message: JSON.stringify(data), + service: DATA_DOG_SERVICE_FIELD + }; + } + + if (context.tracer) { + context.tracer.write({ + url: ddType === 'log' ? DATA_DOG_LOGS_GATEWAY : DATA_DOG_METRICS_GATEWAY, + data: ddData + }); + } + + return requestsUtil.makeRequest({ + body: ddData, + expectedResponseCode: [200, 202], + fullURI: ddType === 'log' ? DATA_DOG_LOGS_GATEWAY : DATA_DOG_METRICS_GATEWAY, + headers: { + 'Content-Type': 'application/json', + 'DD-API-KEY': context.config.apiKey + }, + json: true, + method: 'POST' + }) + .then(() => { + context.logger.debug('success'); + }) + .catch((err) => { + context.logger.error(`error: ${err.message ? err.message : err}`); + }); +}; + +/** + * Builds metric name from path + * + * @param {Array} mpath - metric' path + * + * @returns {string} metric name + */ +function buildMetricName(mpath) { + return mpath.join('.'); +} + +/** + * Builds metric tags + * + * @param {object} tags - metric' tags + * @param {boolean} [joinAll = false] - join all tags into a string + * + * @returns {Array | string} tags + */ +function buildTags(tags, joinAll) { + tags = Object.keys(tags).map(key => `${key}:${tags[key]}`); + if (joinAll) { + tags = tags.join(','); + } + return tags; +} diff --git a/src/lib/consumers/F5_Cloud/index.js b/src/lib/consumers/F5_Cloud/index.js index d5d3e982..d95a12df 100644 --- a/src/lib/consumers/F5_Cloud/index.js +++ b/src/lib/consumers/F5_Cloud/index.js @@ -108,7 +108,7 @@ module.exports = function (context) { signature_type: 0, serialization_type: 1, payload: Buffer.from(JSON.stringify(data), 'utf8'), - payload_schema: `urn:${context.config.payloadSchemaNid}:big-ip:event-schema:${configSchema.toLowerCase()}:v1` + payload_schema: `urn:${context.config.payloadSchemaNid}:big-ip:event-schema:${configSchema.toLowerCase()}:v${context.config.eventSchemaVersion}` }; context.logger.debug(`account_id : ${ingestionRequest.account_id}`); diff --git a/src/lib/consumers/Google_Cloud_Logging/index.js b/src/lib/consumers/Google_Cloud_Logging/index.js new file mode 100644 index 00000000..e9949a84 --- /dev/null +++ b/src/lib/consumers/Google_Cloud_Logging/index.js @@ -0,0 +1,95 @@ +/* + * Copyright 2021. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ + +'use strict'; + +const gcpUtil = require('./../shared/gcpUtil'); +const requestsUtil = require('../../utils/requests'); + +const CLOUD_LOGGING_WRITE_URL = 'https://logging.googleapis.com/v2/entries:write'; + +/** + * See {@link ../README.md#context} for documentation + */ +module.exports = function (context) { + const config = context.config; + const serviceAccount = { + serviceEmail: config.serviceEmail, + privateKeyId: config.privateKeyId, + privateKey: config.privateKey + }; + // Should be in format projects/[PROJECT_ID]/logs/[LOG_ID] + const logName = `${config.logScope}/${config.logScopeId}/logs/${config.logId}`; + + return gcpUtil.getAccessToken(serviceAccount) + .then((accessToken) => { + const entries = []; + const eventData = context.event.data; + /* + If entry data is JSON object, send as JSON object. This is the preferred method. + If entry is not JSON object, send as string in textPayload + */ + let nodeId; + if (typeof eventData === 'object') { + entries.push({ jsonPayload: eventData }); + // search for hostname in various payload types, or undefined if not found + nodeId = (eventData.system || {}).hostname || eventData.hostname; + } else { + entries.push({ textPayload: eventData.toString() }); + } + + // Attaches log entries to a 'resource' - label resource as best as we can + const resource = {}; + if (context.config.reportInstanceMetadata + && context.metadata + && context.metadata.id + && context.metadata.zone) { + // Get zone name from full zone string: projects//zones/ + const zone = context.metadata.zone.split('/').pop(); + resource.type = 'gce_instance'; + resource.labels = { + instance_id: context.metadata.id.toString(), + zone + }; + } else { + resource.type = 'generic_node'; + resource.labels = { + node_id: nodeId, + location: 'global' + }; + } + + const body = { + logName, + resource, + entries + }; + const options = { + headers: { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + method: 'POST', + fullURI: CLOUD_LOGGING_WRITE_URL, + body + }; + if (context.tracer) { + context.tracer.write(body); + } + + return requestsUtil.makeRequest(options); + }) + .then(() => context.logger.debug('success')) + .catch((err) => { + if (err.message && err.message.indexOf('Bad status code: 401') > -1) { + gcpUtil.invalidateToken(serviceAccount); + } + context.logger.error(`error: ${err.message ? err.message : err}`); + }); +}; diff --git a/src/lib/consumers/Google_Cloud_Monitoring/index.js b/src/lib/consumers/Google_Cloud_Monitoring/index.js index 8e12daef..28162530 100644 --- a/src/lib/consumers/Google_Cloud_Monitoring/index.js +++ b/src/lib/consumers/Google_Cloud_Monitoring/index.js @@ -122,14 +122,28 @@ module.exports = function (context) { } } ]; - const resource = { - type: 'generic_node', - labels: { + + // Attaches time-series metrics to a 'resource' - label resource as best as we can + const resource = {}; + if (context.config.reportInstanceMetadata + && context.metadata + && context.metadata.id + && context.metadata.zone) { + // Get zone name from full zone string: projects//zones/ + const zone = context.metadata.zone.split('/').pop(); + resource.type = 'gce_instance'; + resource.labels = { + instance_id: context.metadata.id.toString(), + zone + }; + } else { + resource.type = 'generic_node'; + resource.labels = { namespace: context.event.data.system.hostname, node_id: context.event.data.system.machineId, location: 'global' - } - }; + }; + } timeSeries.timeSeries.push({ metric, points, resource }); }); diff --git a/src/lib/consumers/Kafka/index.js b/src/lib/consumers/Kafka/index.js index 978c73e0..c81eec14 100644 --- a/src/lib/consumers/Kafka/index.js +++ b/src/lib/consumers/Kafka/index.js @@ -29,11 +29,14 @@ if (typeof kafka.KafkaClient.prototype.deleteDisconnected !== 'undefined') { } /** - * See {@link ../README.md#context} for documentation + * Construct Kafka client options from Consumer config + * + * @param {String} kafkaHost Connection string to Kafka host in 'kafka-host1:9092' format + * @param {Object} config Consumer configuration object + * + * @returns {Object} Kafka Client options object */ -module.exports = function (context) { - const config = context.config; - +function buildKafkaClientOptions(kafkaHost, config) { // adding sslOptions to client options at all is the signal to invoke TLS let tlsOptions = null; if (config.protocol === 'binaryTcpTls') { @@ -57,44 +60,98 @@ module.exports = function (context) { }); } - const clientOptions = { - kafkaHost: `${config.host}:${config.port || 9092}`, // format: 'kafka-host1:9092' + return { + kafkaHost, connectTimeout: 3 * 1000, // shorten timeout requestTimeout: 5 * 1000, // shorten timeout sslOptions: tlsOptions, sasl: saslOptions }; +} - const client = new kafka.KafkaClient(clientOptions); - client.on('f5error', (err) => { - context.logger.exception('Unexpected error in KafkaClient', err); - }); +/** + * Caching class for Kafka connections + * + * @property {Object} connectionCache Object containing cached Kafka connections + */ +class ConnectionCache { + constructor() { + this.connectionCache = {}; + } + + /** + * Creates and returns an object containing a Kafka Client and Producer. + * If a cached connection exists, the cached connection is returned. + * + * @param {Object} config Consumer configuration object + * + * @returns {Object} Object containing the Kafka Client and Producer + */ + makeConnection(config) { + const kafkaHost = `${config.host}:${config.port || 9092}`; // format: 'kafka-host1:9092' - const producer = new kafka.Producer(client); - const payload = [ - { - topic: config.topic, - messages: JSON.stringify(context.event.data) + const cacheEntry = this.connectionCache[kafkaHost]; + if (typeof cacheEntry !== 'undefined') { + return Promise.resolve(cacheEntry); } - ]; - if (context.tracer) { - context.tracer.write(payload); + this.connectionCache[kafkaHost] = new Promise((resolve, reject) => { + const clientOptions = buildKafkaClientOptions(kafkaHost, config); + const client = new kafka.KafkaClient(clientOptions); + client.on('f5error', (err) => { + context.logger.exception('Unexpected error in KafkaClient', err); + }); + + const producer = new kafka.Producer(client); + producer.on('ready', () => { + const connection = { + client, + producer + }; + this.connectionCache[kafkaHost] = connection; + resolve(connection); + }); + + producer.on('error', (error) => { + this.connectionCache[kafkaHost] = undefined; + reject(error); + }); + }); + + return Promise.resolve(this.connectionCache[kafkaHost]); } +} - producer.on('ready', () => { - // eslint-disable-next-line no-unused-vars - producer.send(payload, (error, data) => { - if (error) { - context.logger.error(`error: ${error.message ? error.message : error}`); - } else { - context.logger.debug('success'); +const connectionCache = new ConnectionCache(); + +/** + * See {@link ../README.md#context} for documentation + */ +module.exports = function (context) { + const config = context.config; + return Promise.resolve() + .then(() => connectionCache.makeConnection(config)) + .then((connection) => { + const payload = [ + { + topic: config.topic, + messages: JSON.stringify(context.event.data) + } + ]; + + if (context.tracer) { + context.tracer.write(payload); } - }); - }); - // use this to catch any errors - producer.on('error', (error) => { - context.logger.error(`error: ${error.message ? error.message : error}`); - }); + connection.producer.send(payload, (error) => { + if (error) { + context.logger.error(`error: ${error.message ? error.message : error}`); + } else { + context.logger.debug('success'); + } + }); + }) + .catch((error) => { + context.logger.error(`error: ${error.message ? error.message : error}`); + }); }; diff --git a/src/lib/consumers/Statsd/index.js b/src/lib/consumers/Statsd/index.js index 89c25b3f..1746da66 100644 --- a/src/lib/consumers/Statsd/index.js +++ b/src/lib/consumers/Statsd/index.js @@ -16,17 +16,7 @@ const StatsD = require('statsd-client'); const net = require('net'); const constants = require('../../constants'); -const deepCopy = require('../../utils/misc').deepCopy; - - -const FLOAT_REGEXP = /^-?\d+(?:[.,]\d*?)?$/; -const ISO_DATE_REGEXP = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/; -const TS_METRIC_KEYS_TO_IGNORE = [ - 'name' -]; -const TS_TAG_KEYS_TO_IGNORE = [ - 'Capacity' -]; +const metricUtils = require('../shared/metricsUtil'); /** * See {@link ../README.md#context} for documentation @@ -62,7 +52,8 @@ module.exports = function (context) { return tcpCheck .then(() => { - const data = deepCopy(context.event.data); + // should be a copy already, see 'forwarder.js', search for 'filter.apply' + const data = context.event.data; // collect individual metrics, to trace full 'payload' of data const tracePayload = []; @@ -80,16 +71,20 @@ module.exports = function (context) { // instantiate client const client = new StatsD({ host, port, tcp: useTcp }); - findMetrics(data, collectTags, (metricValue, metricPath, metricTags) => { - const metricName = `${metricPrefix}.${makePath(metricPath)}`; - if (context.tracer) { - tracePayload.push([`${metricName}: ${metricValue}`, metricTags]); + metricUtils.findMetricsAndTags(data, { + collectTags, + parseMetrics: true, + onMetric: (metricPath, metricValue, metricTags) => { + const metricName = `${metricPrefix}.${makePath(metricPath)}`; + if (context.tracer) { + tracePayload.push([`${metricName}: ${metricValue}`, metricTags]); + } + client.gauge( + metricName, + metricValue, + metricTags + ); } - client.gauge( - metricName, - metricValue, - metricTags - ); }); if (context.tracer) { @@ -111,65 +106,3 @@ module.exports = function (context) { function makePath(paths) { return paths.map(i => i.replace(/\.|\/|:/g, '-')).join('.'); } - -/** - * @param {object} tsData - system poller's data - * @param {function} cb - callback - */ -function findMetrics(tsData, collectTags, cb) { - (function inner(data, stack) { - const tags = collectTags ? {} : undefined; - - // convert strings to numbers and collect tags (if needed) on first iteration - Object.keys(data).forEach((itemKey) => { - const itemData = data[itemKey]; - if (typeof itemData === 'string' && TS_METRIC_KEYS_TO_IGNORE.indexOf(itemKey) === -1) { - const parsedVal = parseNumber(itemData); - if (parsedVal !== false) { - data[itemKey] = parsedVal; - return; // early return, metric was found and converted - } - } - if (collectTags && TS_TAG_KEYS_TO_IGNORE.indexOf(itemKey) === -1 && canBeTag(itemData)) { - tags[itemKey] = itemData; - } - }); - - // traversing object and reporting metrics (and tags) on second iteration - Object.keys(data).forEach((itemKey) => { - const itemData = data[itemKey]; - if (typeof itemData === 'object') { - stack.push(itemKey); - inner(itemData, stack); - stack.pop(); - } else if (Number.isFinite(itemData)) { - cb(itemData, stack.concat(itemKey), tags); - } - }); - }(tsData, [])); -} - -/** - * @param {any} val - value - * @returns {boolean} true if value can be used as tag - */ -function canBeTag(val) { - return (typeof val === 'string' && val.trim() && !ISO_DATE_REGEXP.test(val)) || typeof val === 'boolean'; -} - -/** - * Parse string to integer or float - * - * @param {string} val - string to parse - * - * @returns {number | boolean} parsed number or false if unable to parse it - */ -function parseNumber(val) { - if (FLOAT_REGEXP.test(val)) { - val = parseFloat(val); - if (typeof val === 'number' && Number.isFinite(val)) { - return val; - } - } - return false; -} diff --git a/src/lib/consumers/shared/gcpUtil.js b/src/lib/consumers/shared/gcpUtil.js index c6f06eed..e5f094f7 100644 --- a/src/lib/consumers/shared/gcpUtil.js +++ b/src/lib/consumers/shared/gcpUtil.js @@ -170,7 +170,29 @@ function invalidateToken(serviceAccount) { tokenCache.removeToken(serviceAccount.privateKeyId); } +// Google's metadata service +const METADATA_URL = 'http://metadata.google.internal/computeMetadata'; + +function getInstanceMetadata(context) { + const metadataOpts = { + fullURI: `${METADATA_URL}/v1/instance/?recursive=true`, + headers: { + 'Metadata-Flavor': 'Google' + }, + allowSelfSignedCert: context.config.allowSelfSignedCert, + // by default request lib will reuse connections + // which is problematic when instance is not on cloud and no metadata + // ECONNRESETs happen and sockets not managed correctly resulting in memory leak + // apparent when we process event listener data due to volume and number of calls + agentOptions: { keepAlive: false }, + timeout: 5 * 1000 // Only wait 5s for Metadata Service response + }; + + return requestsUtil.makeRequest(metadataOpts); +} + module.exports = { getAccessToken, - invalidateToken + invalidateToken, + getInstanceMetadata }; diff --git a/src/lib/consumers/shared/metricsUtil.js b/src/lib/consumers/shared/metricsUtil.js new file mode 100644 index 00000000..b7f918cf --- /dev/null +++ b/src/lib/consumers/shared/metricsUtil.js @@ -0,0 +1,232 @@ +/* + * Copyright 2021. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ + +'use strict'; + +const FLOAT_REGEXP_STRICT = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][+-]?\d+)?)$/; +const FLOAT_REGEXP = /([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][+-]?\d+)?)/; +const ISO_DATE_REGEXP = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/; + +/** + * Keys to do not treat as metrics at all + */ +const DEFAULT_METRICS_TO_IGNORE = []; + +/** + * Keys to do not treat as metrics and treat as tags + * - name - might be 1.1 or 1.x, e.g. see system.networkInterfaces + * - port - TCP/UDP port and etc. + */ +const DEFAULT_METRICS_TO_TAGS = ['name', 'port']; + +/** + * Keys to do not treat as tags + * - Capacity - usually is XX% (10%) (system.diskStorage) + */ +const DEFAULT_TAGS_TO_IGNORE = ['Capacity']; + +/** + * Keys to do not treat as tags and treat as metrics + */ +const DEFAULT_TAGS_TO_METRICS = []; + +module.exports = { + /** + * Inspects payload for metrics and tags + * + * Note: + * - mutates 'tsData' when 'parseMetrics' set to true + * - user can modify 'tags' object received via 'onTags' callback + * - names from 'metricsToIgnore' are ignored completely (can't be used as tag) + * - 'metricsToTags' setting ignores 'metricsToIgnore' and 'tagsToMetrics' settings + * - 'tagsToIgnore' setting ignores 'metricsToTags' + * - 'tagsToMetrics' will ignore any units (if exists) and data will not be normalized: + * example: e.g. string is 'disk space left 2500Kb only' - it will fetch '2500' and + * if next time string will be 'disk space left 4.5mb' - it will fetch '4.5' that + * actually is bigger than 2500 (mb > kb) but numbers without units gives us misleading info + * + * @param {object} tsData - TS data to inspect + * @param {object} [options] - options + * @param {boolean} [options.allowIsoDateTag = false] - allow ISO Date be a tag + * @param {boolean} [options.collectTags = false] - enable tags collection + * @param {boolean} [options.excludeNameFromPath = false] - exclude name from path + * @param {number} [options.maxDepth] - max depth to look metrics and tags for + * @param {Array} [options.metricsToIgnore] - metrics to ignore + * @param {Array} [options.metricsToTags] - metrics to tags + * @param {MetricFoundCb} [options.onMetric] - callback to call once metric found + * @param {TagsFoundCb} [options.onTags] - callback to call once all tags collected for current depth/level + * @param {boolean} [options.parseMetrics = false] - parse and re-assign metrics + * @param {Array} [options.tagsToIgnore] - tags to ignore + * @param {Array} [options.tagsToMetrics] - tags to metrics + * + * @returns {void} once done with inspecting a data + */ + findMetricsAndTags(tsData, options) { + options = options || {}; + // metrics to convert use as tags (no a metric anymore) + const metricsToTags = options.metricsToTags || DEFAULT_METRICS_TO_TAGS; + // metrics to ignore + should include metrics that should be used as tags + const metricsToIgnore = (options.metricsToIgnore || DEFAULT_METRICS_TO_IGNORE).concat(metricsToTags); + // tags to convert to metrics + const tagsToMetrics = options.tagsToMetrics || DEFAULT_TAGS_TO_METRICS; + // tags to ignore + should include tags that should be used as metrics + const tagsToIgnore = (options.tagsToIgnore || DEFAULT_TAGS_TO_IGNORE).concat(tagsToMetrics); + + (function inner(data, stack) { + /** + * NOTE: ALL callbacks should receive COPY of 'stack' to avoid any damage + */ + const tags = options.collectTags ? {} : undefined; + + // disable/enable check for collection of objects + let isCollectionOfObjects = !!options.excludeNameFromPath; + + // convert strings to numbers and collect tags (if needed) on first iteration + Object.keys(data).forEach((itemKey) => { + const itemData = data[itemKey]; + if (typeof itemData === 'object') { + isCollectionOfObjects = isCollectionOfObjects && true; + return; + } + isCollectionOfObjects = false; + if (metricsToTags.indexOf(itemKey) === -1) { + let parsedVal = itemData; + if (typeof parsedVal === 'string') { + // still have to parse data despite on "options.parseMetrics" value + // to differentiate between "metric" and "non-metric" data + parsedVal = parseNumberStrict(itemData); + if (parsedVal === false && tagsToMetrics.indexOf(itemKey) !== -1) { + parsedVal = parseNumber(itemData); + } + } + if (Number.isFinite(parsedVal)) { + if (options.parseMetrics && metricsToIgnore.indexOf(itemKey) === -1) { + data[itemKey] = parsedVal; + } + return; // early return, metric was found and converted + } // otherwise parsing failed and it can be a used a tag + } + if (options.collectTags + && tagsToIgnore.indexOf(itemKey) === -1 + && canBeTag(itemData, options)) { + tags[itemKey] = itemData; + } + }); + + if (options.onTags + && !isCollectionOfObjects + && objectHasKeys(tags)) { + options.onTags(stack.slice(0), tags); + } + + const ignoreKeysInPath = isCollectionOfObjects && options.excludeNameFromPath; + + // traversing object and reporting metrics (and tags) on second iteration + Object.keys(data).forEach((itemKey) => { + const itemData = data[itemKey]; + if (typeof itemData === 'object') { + if (!ignoreKeysInPath) { + stack.push(itemKey); + } + if (!options.maxDepth || options.maxDepth < stack.length) { + inner(itemData, stack); + } + if (!ignoreKeysInPath) { + stack.pop(); + } + } else if (Number.isFinite(itemData) + && options.onMetric + && metricsToIgnore.indexOf(itemKey) === -1) { + options.onMetric(stack.concat(itemKey), itemData, tags); + } + }); + }(tsData, [])); + } +}; + +/** + * Check if data can be used as a tag + * + * @param {any} data - data to check + * @param {object} options - options + * @param {boolean} options.allowIsoDateTag - allow ISO Date strings as tag value + * + * @returns {boolean} true when data can be used as tag + */ +function canBeTag(data, options) { + if (typeof data === 'string') { + if (!data.trim() || (!options.allowIsoDateTag && ISO_DATE_REGEXP.test(data))) { + return false; + } + } + return true; +} + +/** + * Checks if object has keys + * + * Note: this is faster than Object.keys().length + * + * @param {object} obj - object to check + * + * @returns {boolean} true when object has at least one key + */ +function objectHasKeys(obj) { + // eslint-disable-next-line guard-for-in, no-restricted-syntax, prefer-const + for (let x in obj) { + return true; + } + return false; +} + +/** + * Parses string to integer or float (fetches first number) + * + * @param {string} val - string to parse + * + * @returns {number | boolean} parsed number or false if unable to parse it + */ +function parseNumber(val) { + val = val.match(FLOAT_REGEXP); + if (val) { + val = parseFloat(val[0]); + if (typeof val === 'number' && Number.isFinite(val)) { + return val; + } + } + return false; +} + +/** + * Parses string to integer or float (only digits and '.' allowed) + * + * @param {string} val - string to parse + * + * @returns {number | boolean} parsed number or false if unable to parse it + */ +function parseNumberStrict(val) { + if (FLOAT_REGEXP_STRICT.test(val)) { + val = parseFloat(val); + if (typeof val === 'number' && Number.isFinite(val)) { + return val; + } + } + return false; +} + +/** + * @callback MetricFoundCb + * @param {Array} path - metric path + * @param {any} value - metric value + * @param {object} tags - tags + */ +/** + * @callback TagsFoundCb + * @param {Array} path - tags path + * @param {object} tags - all tags for current level + */ diff --git a/src/lib/properties.json b/src/lib/properties.json index c69dc2bd..c1e2ed58 100644 --- a/src/lib/properties.json +++ b/src/lib/properties.json @@ -774,7 +774,7 @@ "includeFirstEntry": { "pattern": "/stats"} }, { - "filterKeys": { "exclude": [ "fullPath", "generation", "appServiceReference", "tmName", "cmpEnabled", "cmpEnableMode", "csMaxConnDur", "csMeanConnDur", "csMinConnDur", "oneMinAvgUsageRatio", "clientside.evictedConns", "clientside.slowKilled", "ephemeral.bitsIn", "ephemeral.bitsOut", "ephemeral.curConns", "ephemeral.evictedConns", "ephemeral.maxConns", "ephemeral.pktsIn", "ephemeral.pktsOut", "ephemeral.slowKilled", "ephemeral.totConns", "fiveSecAvgUsageRatio", "fiveMinAvgUsageRatio", "syncookieStatus", "syncookie.accepts", "syncookie.hwAccepts", "syncookie.hwSyncookies", "syncookie.rejects", "syncookie.hwsyncookieInstance", "syncookie.swsyncookieInstance", "syncookie.syncacheCurr", "syncookie.syncacheOver", "syncookie.syncookies", "syncookie.syncacheOver", "poolReference" ] } + "filterKeys": { "exclude": [ "fullPath", "generation", "appServiceReference", "tmName", "cmpEnabled", "cmpEnableMode", "csMaxConnDur", "csMeanConnDur", "csMinConnDur", "oneMinAvgUsageRatio", "ephemeral.bitsIn", "ephemeral.bitsOut", "ephemeral.curConns", "ephemeral.evictedConns", "ephemeral.maxConns", "ephemeral.pktsIn", "ephemeral.pktsOut", "ephemeral.slowKilled", "ephemeral.totConns", "fiveSecAvgUsageRatio", "fiveMinAvgUsageRatio", "syncookieStatus", "syncookie.accepts", "syncookie.hwAccepts", "syncookie.hwSyncookies", "syncookie.rejects", "syncookie.hwsyncookieInstance", "syncookie.swsyncookieInstance", "syncookie.syncacheCurr", "syncookie.syncacheOver", "syncookie.syncookies", "syncookie.syncacheOver", "poolReference" ] } }, { "renameKeys": { "patterns": { "name/": { "pattern": "name\/(.*)", "group": 1 }, "ltm/virtual": { "pattern": "virtual\/(.*)\/", "group": 1 }, "profilesReference": "profiles" } } diff --git a/src/lib/pullConsumers/Prometheus/index.js b/src/lib/pullConsumers/Prometheus/index.js index ccc9117f..b1cef2d8 100644 --- a/src/lib/pullConsumers/Prometheus/index.js +++ b/src/lib/pullConsumers/Prometheus/index.js @@ -8,7 +8,7 @@ 'use strict'; -const client = require('prom-client'); +const promClient = require('prom-client'); const mergeObjectArray = require('../../utils/misc').mergeObjectArray; const deepCopy = require('../../utils/misc').deepCopy; @@ -78,12 +78,37 @@ module.exports = function (context) { reject(new Error(msg)); } - const metricCollection = collectMetricData(event); // Create a custom metric registry each time, as the default registry will persist across API calls - const registry = new client.Registry(); + const registry = new promClient.Registry(); - // create prometheus metrics for all collected metrics - applyPrometheusFormatting(metricCollection, registry); + // Collect metrics from event + const collectedMetrics = collectMetrics(event); + const prioritizedMetrics = prioritizeCollectedMetrics(collectedMetrics); + + const orderedPriorityKeys = Object.keys(prioritizedMetrics).sort((a, b) => a - b); + + orderedPriorityKeys.forEach((priorityKey) => { + prioritizedMetrics[priorityKey].forEach((metricObject) => { + let metricName = `f5_${metricObject.metricName}`; + // Check if already registered + if (typeof registry.getSingleMetric(metricName) !== 'undefined') { + metricName = `f5_${toPrometheusMetricFormat(metricObject.originalMetricName, true).metricName}`; + } + try { + const gauge = new promClient.Gauge({ + name: metricName, + help: metricObject.originalMetricName, + registers: [registry], + labelNames: metricObject.labelNames + }); + metricObject.labels.forEach((labelObj) => { + gauge.set(labelObj.labels, labelObj.value); + }); + } catch (err) { + logger.error(`Unable to register metric for: ${metricObject.originalMetricName}. ${err.message || err}`); + } + }); + }); // Return metrics from the registry const output = registry.metrics(); @@ -103,7 +128,7 @@ module.exports = function (context) { * * @returns {Object} Returns an Object containing metrics, metric values and any associated metadata */ -function collectMetricData(event) { +function collectMetrics(event) { const filteredEvents = event .filter(d => (typeof d !== 'undefined' && Object.keys(d).indexOf('data') !== -1)); @@ -122,41 +147,82 @@ function collectMetricData(event) { return mergeObjectArray(metrics); } + /** - * Apply Prometheus formatting to the provided metrics collection. - * Will rename metric names to comply with Prometheus naming rules, create a Prometheus Gauge, - * and set the gauge value for each metric. + * Prioritizes metrics by the number of transformations that were required to convert a metric name + * into a valid Prometheus metric name. * - * @param {Object} data - Data to format according to Prometheus spec - * @param {Registry} registry - Prometheus 'Registry' to register each Metric to + * @param {Object} collectedMetrics - Metrics collection + * + * @returns {Object} Returns a prioritized object with required data for Prometheus formatted metrics. + * Example object: + * { + * 0: [ + * { + * metricName, + * originalMetricName, + * labelNames, + * labels + * }, ... + * ], + * 1: [...], + * ... + * } */ -function applyPrometheusFormatting(data, registry) { - Object.keys(data).forEach((metricName) => { - const labelNames = Array.from(data[metricName].labels || []); +function prioritizeCollectedMetrics(collectedMetrics) { + const prioritizedMetrics = {}; - const gauge = new client.Gauge({ - name: `f5_${formatPrometheusName(metricName)}`, // Prefix metric names with 'f5' to differentiate F5 metrics - help: metricName, - registers: [registry], - labelNames - }); - data[metricName].values.forEach((valueObj) => { - // Pass labels Object or Empty Object (prom-client has logic to handle empty objects) to gauge - const gaugeLabels = (typeof valueObj.labels === 'undefined') ? {} : valueObj.labels; - gauge.set(gaugeLabels, valueObj.value); + Object.keys(collectedMetrics).forEach((originalMetricName) => { + const formattedMetric = toPrometheusMetricFormat(originalMetricName); + const labelNames = Array.from(collectedMetrics[originalMetricName].labels || []); + + if (typeof prioritizedMetrics[formattedMetric.transformCount] === 'undefined') { + prioritizedMetrics[formattedMetric.transformCount] = []; + } + prioritizedMetrics[formattedMetric.transformCount].push({ + metricName: formattedMetric.metricName, + originalMetricName, + labelNames, + labels: collectedMetrics[originalMetricName].values.map((valueObj) => { + const gaugeLabels = (typeof valueObj.labels === 'undefined') ? {} : valueObj.labels; + return { labels: gaugeLabels, value: valueObj.value }; + }) }); }); + + return prioritizedMetrics; } /** + * Generates a Prometheus formatted metric name from a provided string. + * Optionally replaces invalid metric name characters with hex code values * - * @param {String} name - string to reformat to match Prometheus requirements + * @param {String} name - Original metric name + * @param {Boolean} useHexFormatting - Whether to replace invalid characters with hex codes (default=false) * - * @returns {String} Returns string with unsupported characters replaced + * @returns {Object} Returns an object with the Prometheus formatted metric name, and the number of character blocks + * that were replaced */ -function formatPrometheusName(name) { +function toPrometheusMetricFormat(name, useHexFormatting) { const prometheusNameRegex = /[^a-zA-Z0-9_:]+/g; - return name.replace(prometheusNameRegex, '_'); + let newName; + let transformCount = 0; + + if (useHexFormatting) { + newName = name.replace(/[^a-zA-Z0-9_]+/g, (match) => { + transformCount += 1; + return `__x${Buffer.from(match).toString('hex').toUpperCase()}__`; + }); + } else { + newName = name.replace(prometheusNameRegex, () => { + transformCount += 1; + return '_'; + }); + } + return { + metricName: newName, + transformCount + }; } /** @@ -277,7 +343,7 @@ function getMetricLabels(pathItems) { // Iterate by +2 - code in loop will the index to locate the key and value of the key-value pair for (let i = 0; i < pathItems.length; i += 2) { if (typeof pathItems[i] !== 'undefined' && typeof pathItems[i + 1] !== 'undefined') { - labels[formatPrometheusName(pathItems[i])] = pathItems[i + 1]; + labels[toPrometheusMetricFormat(pathItems[i]).metricName] = pathItems[i + 1]; } } } diff --git a/src/lib/utils/config.js b/src/lib/utils/config.js index 8f51e3ab..f16d69b7 100644 --- a/src/lib/utils/config.js +++ b/src/lib/utils/config.js @@ -155,12 +155,9 @@ function getPollerTraceValue(systemTrace, pollerTrace) { /** * @param {Component} component - component * - * @returns {string} trace prefix + * @returns {string} trace prefix, which is the namespace (even for the default namespace) */ function getTracePrefix(component) { - if (component.namespace === constants.DEFAULT_UNNAMED_NAMESPACE) { - return ''; // keep current behavior - } return `${component.namespace}::`; } diff --git a/src/lib/utils/metadata.js b/src/lib/utils/metadata.js index 99b59789..30e1d983 100644 --- a/src/lib/utils/metadata.js +++ b/src/lib/utils/metadata.js @@ -9,6 +9,7 @@ 'use strict'; const azureUtil = require('../consumers/shared/azureUtil'); +const gcpUtil = require('../consumers/shared/gcpUtil'); const logger = require('../logger'); const retryPromise = require('./promise').retry; const util = require('./misc'); @@ -31,6 +32,8 @@ function getInstanceMetadata(consumerContext) { let promise = Promise.resolve(); if (consumerType.indexOf('Azure') > -1) { promise = retryPromise(() => azureUtil.getInstanceMetadata(consumerContext), { maxTries: 1 }); + } else if (consumerType.indexOf('Google') > -1) { + promise = retryPromise(() => gcpUtil.getInstanceMetadata(consumerContext), { maxTries: 1 }); } return promise diff --git a/src/lib/utils/requests.js b/src/lib/utils/requests.js index 702fd1c9..70c4570e 100644 --- a/src/lib/utils/requests.js +++ b/src/lib/utils/requests.js @@ -95,7 +95,6 @@ const buildProxyURL = function (proxyOpts) { * @param {String} [options.method = 'GET'] - HTTP method * @param {Any} [options.body] - HTTP body, must be a Buffer, String or ReadStream or JSON-serializable object * @param {Boolean} [options.json = true] - sets HTTP body to JSON representation of value - * and adds Content-type: application/json header * @param {Object} [options.headers] - HTTP headers * @param {Object} [options.continueOnErrorCode = false] - continue on non-successful response code * @param {Boolean} [options.allowSelfSignedCert = false] - do not require SSL certificates be valid diff --git a/src/schema/1.22.0/actions_schema.json b/src/schema/1.22.0/actions_schema.json new file mode 100644 index 00000000..c658439b --- /dev/null +++ b/src/schema/1.22.0/actions_schema.json @@ -0,0 +1,187 @@ +{ + "$id": "actions_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming Actions schema", + "description": "", + "type": "object", + "definitions": { + "baseActionsChain": { + "title": "Chain of Actions", + "description": "Actions to be performed on the data.", + "type": "array", + "items": { + "$ref": "#/definitions/baseActionObject" + } + }, + "baseActionObject": { + "title": "Base Action object", + "description": "Base object to build actions.", + "type": "object", + "properties": { + "enable": { + "title": "Enable", + "description": "Whether to enable this action in the declaration or not.", + "type": "boolean", + "default": true + } + } + }, + "baseConditionalActionObject": { + "title": "Base Action object with support for conditional statements", + "description": "Base Action object with support for conditional statements.", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/baseActionObject" }, + { + "anyOf": [ + { + "properties": { + "ifAllMatch": { + "title": "If All Match", + "description": "The conditions that will be checked against. All must be true.", + "type": "object", + "additionalProperties": true + } + }, + "not": { "required": ["ifAnyMatch"] } + }, + { + "properties": { + "ifAnyMatch": { + "title": "If Any Match", + "description": "An array of ifAllMatch objects. Any individual ifAllMatch object may match, but each condition within an ifAllMatch object must be true", + "type": "array" + } + }, + "not": { "required": ["ifAllMatch"] } + } + ] + } + ] + }, + "subLocation": { + "title": "Location", + "description": "Used to specify a location in TS data. Use boolean type with value true to specify the location.", + "oneOf": [ + { + "type": "boolean", + "const": true + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/subLocation" + } + } + ] + }, + "locations": { + "title": "Location", + "description": "The location(s) to apply the action.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/subLocation" + } + }, + "setTagAction": { + "title": "setTag Action", + "description": "Action to assign a tag(s) to particular or default location", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/baseConditionalActionObject" }, + { + "properties": { + "setTag": { + "title": "Set Tag", + "description": "The tag values to be added.", + "type": "object", + "additionalProperties": true + }, + "locations": { + "title": "Location", + "description": "The location(s) to apply the action.", + "allOf": [{ "$ref": "#/definitions/locations" }] + }, + "enable": {}, + "ifAllMatch": {}, + "ifAnyMatch": {} + }, + "additionalProperties": false, + "required": ["setTag"] + } + ] + }, + "includeDataAction": { + "title": "includeData Action", + "description": "Action to specify data fields to include in the output", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/baseConditionalActionObject" }, + { + "properties": { + "includeData": { + "title": "Include Data", + "description": "The data fields to include in the output", + "type": "object", + "additionalProperties": false + }, + "locations": { + "title": "Location", + "description": "The location(s) to apply the action.", + "allOf": [{ "$ref": "#/definitions/locations" }] + }, + "enable": {}, + "ifAllMatch": {}, + "ifAnyMatch": {} + }, + "additionalProperties": false, + "required": ["includeData", "locations"] + } + ] + }, + "excludeDataAction": { + "title": "excludeData Action", + "description": "Action to specify data fields to exclude form the output", + "type": "object", + "allOf": [ + { "$ref": "#/definitions/baseConditionalActionObject" }, + { + "properties": { + "excludeData": { + "title": "Exclude Data", + "description": "The data fields to exclude from the output", + "type": "object", + "additionalProperties": false + }, + "locations": { + "title": "Location", + "description": "The location(s) to apply the action.", + "allOf": [{ "$ref": "#/definitions/locations" }] + }, + "enable": {}, + "ifAllMatch": {}, + "ifAnyMatch": {} + }, + "additionalProperties": false, + "required": ["excludeData", "locations"] + } + ] + }, + "inputDataStreamActionsChain": { + "title": "", + "description": "", + "allOf": [ + { "$ref": "#/definitions/baseActionsChain" }, + { + "items": { + "oneOf": [ + { "$ref": "#/definitions/excludeDataAction" }, + { "$ref": "#/definitions/includeDataAction" }, + { "$ref": "#/definitions/setTagAction" } + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/schema/1.22.0/base_schema.json b/src/schema/1.22.0/base_schema.json new file mode 100644 index 00000000..d94af2cf --- /dev/null +++ b/src/schema/1.22.0/base_schema.json @@ -0,0 +1,310 @@ +{ + "$id": "base_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming", + "description": "", + "type": "object", + "definitions": { + "enable": { + "title": "Enable", + "description": "This property can be used to enable/disable the poller/listener" , + "type": "boolean" + }, + "trace": { + "title": "Trace", + "description": "Enables data dumping to file. Boolean uses pre-defined file location, however value could be a string which contains path to a specific file instead" , + "minLength": 1, + "type": ["boolean", "string"] + }, + "traceConfig": { + "title": "Trace (v2)", + "description": "Enables data dumping to file. Boolean uses pre-defined file location, however value could be a string which contains path to a specific file instead", + "type": "object", + "properties": { + "type": { + "title": "Trace type", + "description": "Trace type - output data or input data", + "type": "string", + "enum": ["output", "input"] + }, + "path": { + "title": "Path to trace file", + "description": "Path to trace file to write data to", + "type": "string", + "minLength": 1 + } + }, + "required": ["type"] + }, + "traceV2": { + "title": "Trace (v2)", + "description": "Enables data dumping to file. Boolean uses pre-defined file location, however value could be a string which contains path to a specific file instead", + "oneOf": [ + { "$ref": "#/definitions/traceConfig" }, + { + "type": "array", + "minItems": 1, + "maxItems": 2, + "uniqueItemProperties": ["type"], + "items": { + "allOf": [{ + "$ref": "#/definitions/traceConfig" + }] + } + } + ] + }, + "secret": { + "title": "Passphrase (secret)", + "description": "" , + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Telemetry streaming secret class", + "type": "string", + "enum": [ "Secret" ], + "default": "Secret" + }, + "cipherText": { + "title": "Cipher Text: this contains a secret to encrypt", + "type": "string" + }, + "environmentVar": { + "title": "Environment Variable: this contains the named env var where the secret resides", + "type": "string", + "minLength": 1 + }, + "protected": { + "$comment": "Meta property primarily used to determine if 'cipherText' needs to be encrypted", + "title": "Protected", + "type": "string", + "enum": [ "plainText", "plainBase64", "SecureVault" ], + "default": "plainText" + } + }, + "oneOf": [ + { "required": [ "cipherText" ] }, + { "required": [ "environmentVar" ] } + ], + "f5secret": true + }, + "username": { + "$comment": "Common field for username to use everywhere in scheme", + "title": "Username", + "type": "string", + "minLength": 1 + }, + "stringOrSecret": { + "allOf": [ + { + "if": { "type": "string" }, + "then": {}, + "else": {} + }, + { + "if": { "type": "object" }, + "then": { "$ref": "base_schema.json#/definitions/secret" }, + "else": {} + } + ] + }, + "constants": { + "title": "Constants", + "description": "" , + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Telemetry streaming constants class", + "type": "string", + "enum": [ "Constants" ] + } + }, + "additionalProperties": true + }, + "tag": { + "$comment": "Defaults do not get applied for $ref objects, so place defaults alongside instead.", + "title": "Tag", + "description": "" , + "type": "object", + "properties": { + "tenant": { + "title": "Tenant tag", + "type": "string", + "minLength": 1 + }, + "application": { + "title": "Application tag", + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": true + }, + "match": { + "$comment": "Defaults do not get applied for $ref objects, so place defaults alongside instead.", + "title": "Pattern to filter data", + "description": "", + "type": "string" + }, + "enableHostConnectivityCheck": { + "$comment": "This property can be used to enable/disable the host connectivity check in configurations where this is in effect", + "title": "Host", + "description": "" , + "type": "boolean" + }, + "allowSelfSignedCert": { + "$comment": "This property can be used by consumers, system pollers to enable/disable SSL Cert check", + "title": "Allow Self-Signed Certificate", + "description": "" , + "type": "boolean" + }, + "host": { + "$comment": "This property can be used by consumers, system pollers", + "title": "Host", + "description": "" , + "type": "string", + "minLength": 1, + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ], + "hostConnectivityCheck": true + }, + "port": { + "title": "Port", + "description": "" , + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "protocol": { + "title": "Protocol", + "description": "" , + "type": "string", + "enum": [ "http", "https" ] + }, + "proxy": { + "title": "Proxy Configuration", + "description": "", + "type": "object", + "dependencies": { + "passphrase": [ "username" ] + }, + "required": [ "host" ], + "properties": { + "host": { + "$ref": "#/definitions/host" + }, + "port": { + "default": 80, + "allOf": [ + { + "$ref": "#/definitions/port" + } + ] + }, + "protocol": { + "default": "http", + "allOf": [ + { + "$ref": "#/definitions/protocol" + } + ] + }, + "enableHostConnectivityCheck": { + "$ref": "#/definitions/enableHostConnectivityCheck" + }, + "allowSelfSignedCert": { + "$ref": "#/definitions/allowSelfSignedCert" + }, + "username": { + "$ref": "#/definitions/username" + }, + "passphrase": { + "$ref": "#/definitions/secret" + } + }, + "additionalProperties": false + } + }, + "properties": { + "class": { + "title": "Class", + "description": "Telemetry streaming top level class", + "type": "string", + "enum": [ "Telemetry" ] + }, + "schemaVersion": { + "title": "Schema version", + "description": "Version of ADC Declaration schema this declaration uses", + "type": "string", + "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", + "enum": [ "1.22.0", "1.21.0", "1.20.1", "1.20.0", "1.19.0", "1.18.0", "1.17.0", "1.16.0", "1.15.0", "1.14.0", "1.13.0", "1.12.0", "1.11.0", "1.10.0", "1.9.0", "1.8.0", "1.7.0", "1.6.0", "1.5.0", "1.4.0", "1.3.0", "1.2.0", "1.1.0", "1.0.0", "0.9.0" ], + "default": "1.22.0" + }, + "$schema": { + "title": "Schema", + "description": "", + "type": "string" + } + }, + "additionalProperties": { + "$comment": "AJV does not resolve defaults inside oneOf/anyOf, so instead use allOf. Any schema refs should also use allOf with an if/then/else on class", + "properties": { + "class": { + "title": "Class", + "type": "string", + "enum": [ + "Telemetry_System", + "Telemetry_System_Poller", + "Telemetry_Listener", + "Telemetry_Consumer", + "Telemetry_Pull_Consumer", + "Telemetry_iHealth_Poller", + "Telemetry_Endpoints", + "Telemetry_Namespace", + "Controls", + "Shared" + ] + } + }, + "allOf": [ + { + "$ref": "system_schema.json#" + }, + { + "$ref": "system_poller_schema.json#" + }, + { + "$ref": "listener_schema.json#" + }, + { + "$ref": "consumer_schema.json#" + }, + { + "$ref": "pull_consumer_schema.json#" + }, + { + "$ref": "ihealth_poller_schema.json#" + }, + { + "$ref": "endpoints_schema.json#" + }, + { + "$ref": "controls_schema.json#" + }, + { + "$ref": "shared_schema.json#" + }, + { + "$ref": "namespace_schema.json#" + } + ] + }, + "required": [ + "class" + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/consumer_schema.json b/src/schema/1.22.0/consumer_schema.json new file mode 100644 index 00000000..6d218f36 --- /dev/null +++ b/src/schema/1.22.0/consumer_schema.json @@ -0,0 +1,1199 @@ +{ + "$id": "consumer_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming Consumer schema", + "description": "", + "type": "object", + "definitions": { + "jmesPathAction": { + "title": "JMESPath Action", + "description": "Will use a JMESPath expression to modify the incoming data payload", + "type": "object", + "allOf": [ + { "$ref": "actions_schema.json#/definitions/baseActionObject" }, + { + "properties": { + "JMESPath": { + "title": "JMESPath", + "description": "Will use a JMESPath expression to modify the incoming data payload", + "type": "object", + "additionalProperties": false + }, + "expression": { + "title": "Expression", + "description": "The JMESPath expression to be applied to the incoming data payload", + "type": "string", + "minLength": 1 + }, + "enable": {} + }, + "additionalProperties": false, + "required": ["JMESPath", "expression"] + } + ] + }, + "autoTaggingStatsd": { + "title": "Statsd auto tagging", + "description": "Will parse incoming payload for values to automatically add as tags.", + "type": "object", + "properties": { + "method": { + "title": "AutoTagging method", + "description": "AutoTagging method to use to fetch tags", + "type": "string", + "enum": ["sibling"] + } + }, + "additionalProperties": false, + "required": ["method"] + }, + "genericHttpActions": { + "title": "Actions", + "description": "Actions to be performed on the Generic HTTP Consumer.", + "allOf": [ + { "$ref": "actions_schema.json#/definitions/baseActionsChain" }, + { + "items": { + "oneOf": [ + { "$ref": "#/definitions/jmesPathAction" } + ] + } + } + ] + }, + "host": { + "$comment": "Required for certain consumers: standard property", + "title": "Host", + "description": "FQDN or IP address" , + "type": "string", + "minLength": 1, + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ], + "hostConnectivityCheck": true + }, + "protocols": { + "$comment": "Required for certain consumers: standard property", + "title": "Protocols (all)", + "description": "" , + "type": "string", + "enum": [ "https", "http", "tcp", "udp", "binaryTcpTls", "binaryTcp" ] + }, + "port": { + "$comment": "Required for certain consumers: standard property", + "title": "Port", + "description": "" , + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "path": { + "$comment": "Required for certain consumers: standard property", + "title": "Path", + "description": "Path to post data to", + "type": ["string", "object"], + "minLength": 1, + "f5expand": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/stringOrSecret" + } + ] + }, + "method": { + "$comment": "Required for certain consumers: standard property", + "title": "Method", + "description": "HTTP method to use (limited to sensical choices)" , + "type": "string", + "enum": [ "POST", "GET", "PUT" ] + }, + "headers": { + "$comment": "Required for certain consumers: standard property", + "title": "Headers", + "description": "HTTP headers to use" , + "type": "array", + "items": { + "properties": { + "name": { + "description": "Name of this header", + "type": "string", + "f5expand": true, + "minLength": 1 + }, + "value": { + "description": "Value of this header", + "type": ["string", "object"], + "f5expand": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/stringOrSecret" + } + ] + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "customOpts": { + "$comment": "Required for certain consumers: standard property", + "title": "Custom Opts (Client Library Dependent)", + "description": "Additional options for use by consumer client library. Refer to corresponding consumer lib documentation for acceptable keys and values." , + "type": "array", + "items": { + "properties": { + "name": { + "description": "Name of the option", + "type": "string", + "f5expand": true, + "minLength": 1 + }, + "value": { + "description": "Value of the option", + "minLength": 1, + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "allOf": [ + { + "f5expand": true + }, + { + "$ref": "base_schema.json#/definitions/stringOrSecret" + } + ] + } + ] + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "format": { + "$comment": "Required for certain consumers: Splunk", + "title": "Format (informs consumer additional formatting may be required)", + "description": "Legacy format is deprecated", + "type": "string", + "enum": [ "default", "legacy", "multiMetric" ] + }, + "username": { + "$comment": "Required for certain consumers: standard property", + "title": "Username", + "description": "" , + "minLength": 1, + "type": "string", + "f5expand": true + }, + "region": { + "$comment": "Required for certain consumers: AWS_CloudWatch, AWS_S3, Azure_Log_Analytics, Azure_App_Insights", + "title": "Region", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "bucket": { + "$comment": "Required for certain consumers: AWS_S3", + "title": "Bucket", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "logGroup": { + "$comment": "Required for certain consumers: AWS_CloudWatch", + "title": "Log Group", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "logStream": { + "$comment": "Required for certain consumers: AWS_CloudWatch", + "title": "Log Stream", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "metricNamespace": { + "$comment": "Required for certain consumers: AWS_CloudWatch", + "title": "Metric Name", + "description": "The namespace for the metrics" , + "type": "string", + "f5expand": true, + "minLength": 1 + }, + "workspaceId": { + "$comment": "Required for certain consumers: Azure_Log_Analytics", + "title": "Workspace ID", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "useManagedIdentity": { + "$comment": "Required for certain consumers: Azure_Log_Analytics and Azure_Application_Insights", + "title": "Use Managed Identity", + "description": "Determines whether to use Managed Identity to perform authorization for Azure services", + "type": "boolean", + "default": false + }, + "appInsightsResourceName": { + "$comment": "Required for certain consumers: Azure_Application_Insights", + "title": "Application Insights Resource Name (Pattern)", + "description": "Name filter used to determine which App Insights resource to send metrics to. If not provided, TS will send metrics to App Insights in the subscription in which the managed identity has permissions to", + "type": "string", + "minLength": 1 + }, + "instrumentationKey": { + "$comment": "Required for certain consumers: Azure_Application_Insights", + "title": "Instrumentation Key", + "description": "Used to determine which App Insights resource to send metrics to", + "anyOf": [ + { + "type": "string", + "f5expand": true, + "minLength": 1 + }, + { + "type":"array", + "items": { + "type": "string", + "f5expand": true, + "minLength": 1 + }, + "minItems": 1 + } + ] + }, + "maxBatchIntervalMs": { + "$comment": "Required for certain consumers: Azure_Application_Insights", + "title": "Maximum Batch Interval (ms)", + "description": "The maximum amount of time to wait in milliseconds to for payload to reach maxBatchSize", + "type": "integer", + "minimum": 1000, + "default": 5000 + }, + "maxBatchSize": { + "$comment": "Required for certain consumers: Azure_Application_Insights", + "title": "Maximum Batch Size", + "description": "The maximum number of telemetry items to include in a payload to the ingestion endpoint", + "type": "integer", + "minimum": 1, + "default": 250 + }, + "topic": { + "$comment": "Required for certain consumers: Kafka", + "title": "Topic", + "description": "" , + "type": "string", + "f5expand": true + }, + "index": { + "$comment": "Required for certain consumers: ElasticSearch", + "title": "Index Name", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "apiVersion": { + "$comment": "Required for certain consumers: ElasticSearch", + "title": "API Version", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "dataType": { + "$comment": "Required for certain consumers: AWS_CloudWatch, ElasticSearch", + "title": "Data type", + "description": "" , + "type": "string", + "f5expand": true + }, + "authenticationProtocol": { + "$comment": "Required for certain consumers: Kafka", + "title": "Authentication Protocol", + "description": "" , + "type": "string", + "f5expand": true, + "enum": [ + "SASL-PLAIN", + "TLS", + "None" + ] + }, + "clientCertificate": { + "$comment": "Required for certain consumers: Kafka, Generic HTTP", + "title": "Client Certificate", + "description": "Certificate(s) to use when connecting to a secured endpoint.", + "type": "object", + "f5expand": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/secret" + } + ] + }, + "rootCertificate": { + "$comment": "Required for certain consumers: Kafka, Generic HTTP", + "title": "Root Certificate", + "description": "Certificate Authority root certificate, used to validate certificate chains.", + "type": "object", + "f5expand": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/secret" + } + ] + }, + "projectId": { + "$comment": "Required for certain consumers: Google_Cloud_Monitoring", + "title": "Project ID", + "description": "The ID of the relevant project.", + "type": "string", + "minLength": 1, + "f5expand": true + }, + "serviceEmail": { + "$comment": "Required for certain consumers: Google_Cloud_Monitoring, Google_Cloud_Logging", + "title": "Service Email", + "description": "The service email.", + "type": "string", + "minLength": 1, + "f5expand": true + }, + "privateKeyId": { + "$comment": "Required for certain consumers: Google_Cloud_Monitoring, Google_Cloud_Logging", + "title": "Private Key ID", + "description": "The private key ID.", + "type": "string", + "minLength": 1, + "f5expand": true + }, + "logScope": { + "$comment": "Required for certain consumers: Google_Cloud_Logging", + "title": "Logging Scope Type", + "description": "" , + "enum": ["projects", "organizations", "billingAccounts", "folders"], + "f5expand": true + }, + "logScopeId": { + "$comment": "Required for certain consumers: Google_Cloud_Logging", + "title": "Logging Scope ID", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "logId": { + "$comment": "Required for certain consumers: Google_Cloud_Logging", + "title": "Logging ID", + "description": "" , + "type": "string", + "format": "regex", + "pattern": "^[a-zA-z0-9._-]+$", + "minLength": 1, + "f5expand": true + }, + "privateKey": { + "$comment": "Required for certain consumers: Kafka, Generic HTTP", + "title": "Private Key", + "description": "Private Key", + "type": "object", + "f5expand": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/secret" + } + ] + }, + "eventSchemaVersion": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Event Schema Version", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true, + "default": "1" + }, + "f5csTenantId": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "F5CS Tenant ID", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "f5csSensorId": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "F5CS Sensor ID", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "payloadSchemaNid": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Namespace ID for payloadSchema", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "serviceAccount": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Service Account", + "description": "Service Account to authentication" , + "type": "object", + "properties": { + "authType": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "SA Type", + "description": "" , + "type": "string", + "enum": ["google-auth" ] + }, + "type": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "SA Type", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "projectId": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Project Id", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "privateKeyId": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Private Key Id", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "privateKey": { + "$ref": "base_schema.json#/definitions/secret" + }, + "clientEmail": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Client Email", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "clientId": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Client Id", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "authUri": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Auth Uri", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "tokenUri": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Token Uri", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "authProviderX509CertUrl": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Auth Provider X509 Cert Url", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "clientX509CertUrl": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Client X509 Cert Url", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + } + }, + "additionalProperties": false, + "allOf": [ + { + "if": { "properties": { "authType": { "const": "google-auth" } } }, + "then": { + "required": [ + "type", + "projectId", + "privateKeyId", + "privateKey", + "clientEmail", + "clientId", + "authUri", + "tokenUri", + "authProviderX509CertUrl", + "clientX509CertUrl" + ] + }, + "else": {} + }] + }, + "targetAudience": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Target Audience", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "useSSL": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "useSSL", + "description": "To decide if GRPC connection should use SSL and then it is secured" , + "type": "boolean", + "f5expand": true + }, + "compressionType": { + "$comment": "Required for certain consumers: Splunk", + "title": "Data compression", + "description": "Whether or not to compress data and what compression to use before sending it to destination", + "type": "string", + "enum": ["none", "gzip"] + }, + "reportInstanceMetadata": { + "$comment": "Required for certain consumers: Google_Cloud_Monitoring, Google_Cloud_Logging", + "title": "Instance metadata reporting", + "description": "Enables instance metadata collection and reporting" , + "type": "boolean", + "f5expand": true + }, + "apiKey": { + "$comment": "Required for certain consumers: DataDog", + "title": "API key to use to push data", + "type": "string", + "minLength": 1, + "f5expand": true + } + }, + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_Consumer" } } }, + "then": { + "required": [ + "class", + "type" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Consumer class", + "type": "string", + "enum": [ "Telemetry_Consumer" ] + }, + "enable": { + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "trace": { + "default": false, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/trace" + } + ] + }, + "type": { + "title": "Type", + "description": "" , + "type": "string", + "enum": [ + "AWS_CloudWatch", + "AWS_S3", + "Azure_Log_Analytics", + "Azure_Application_Insights", + "DataDog", + "default", + "ElasticSearch", + "Generic_HTTP", + "Google_Cloud_Logging", + "Google_Cloud_Monitoring", + "Google_StackDriver", + "Graphite", + "Kafka", + "Splunk", + "Statsd", + "Sumo_Logic", + "F5_Cloud" + ] + }, + "enableHostConnectivityCheck": { + "$ref": "base_schema.json#/definitions/enableHostConnectivityCheck" + }, + "allowSelfSignedCert": { + "default": false, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/allowSelfSignedCert" + } + ] + } + }, + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "addTags": {}, + "actions": {}, + "apiKey": {}, + "class": {}, + "enable": {}, + "trace": {}, + "type": {}, + "enableHostConnectivityCheck": {}, + "allowSelfSignedCert": {}, + "host": {}, + "protocol": {}, + "port": {}, + "path": {}, + "method": {}, + "headers": {}, + "customOpts": {}, + "username": {}, + "passphrase": {}, + "format": {}, + "workspaceId": {}, + "useManagedIdentity": {}, + "instrumentationKey": {}, + "appInsightsResourceName": {}, + "maxBatchIntervalMs": {}, + "maxBatchSize": {}, + "region": {}, + "logGroup": {}, + "logStream": {}, + "metricNamespace": {}, + "bucket": {}, + "topic": {}, + "apiVersion": {}, + "index": {}, + "dataType": {}, + "authenticationProtocol": {}, + "projectId": {}, + "serviceEmail": {}, + "privateKey": {}, + "privateKeyId": {}, + "clientCertificate": {}, + "rootCertificate": {}, + "fallbackHosts": {}, + "eventSchemaVersion": {}, + "f5csTenantId": {}, + "f5csSensorId": {}, + "payloadSchemaNid": {}, + "serviceAccount": {}, + "targetAudience": {}, + "useSSL": {}, + "proxy": {}, + "compressionType": {}, + "logScope": {}, + "logScopeId": {}, + "logId": {}, + "reportInstanceMetadata": {} + }, + "additionalProperties": false, + "dependencies": { + "actions": { + "allOf": [ + { + "properties": { "type": { "const": "Generic_HTTP" } } + } + ] + } + } + }, + { + "if": { "properties": { "type": { "const": "default" } } }, + "then": { + "required": [], + "properties": {} + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Generic_HTTP" } } }, + "then": { + "required": [ + "host" + ], + "properties": { + "host": { "$ref": "#/definitions/host" }, + "fallbackHosts": { + "type": "array", + "description": "List FQDNs or IP addresses to be used as fallback hosts" , + "minItems": 1, + "items": { + "allOf": [{ + "$ref": "#/definitions/host" + }] + } + }, + "protocol": { "$ref": "#/definitions/protocols", "default": "https" }, + "port": { "$ref": "#/definitions/port", "default": 443 }, + "path": { "$ref": "#/definitions/path", "default": "/" }, + "method": { "$ref": "#/definitions/method", "default": "POST" }, + "headers": { "$ref": "#/definitions/headers" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" }, + "proxy": { "$ref": "base_schema.json#/definitions/proxy" }, + "privateKey": { "$ref": "#/definitions/privateKey" }, + "clientCertificate": { "$ref": "#/definitions/clientCertificate" }, + "rootCertificate": { "$ref": "#/definitions/rootCertificate" }, + "actions": { "$ref": "#/definitions/genericHttpActions" } + }, + "allOf": [ + { + "if": { "required": [ "clientCertificate" ] }, + "then": { "required": [ "privateKey" ] } + }, + { + "if": { "required": [ "privateKey" ] }, + "then": { "required": [ "clientCertificate" ] } + } + ] + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Splunk" } } }, + "then": { + "required": [ + "host", + "passphrase" + ], + "properties": { + "host": { "$ref": "#/definitions/host" }, + "protocol": { "$ref": "#/definitions/protocols", "default": "https" }, + "port": { "$ref": "#/definitions/port", "default": 8088 }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" }, + "format": { "$ref": "#/definitions/format", "default": "default" }, + "proxy": { "$ref": "base_schema.json#/definitions/proxy" }, + "compressionType": { "$ref": "#/definitions/compressionType", "default": "gzip" } + } + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Azure_Log_Analytics" } } }, + "then": { + "required": [ + "workspaceId" + ], + "properties": { + "workspaceId": { "$ref": "#/definitions/workspaceId" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" }, + "useManagedIdentity": { "$ref": "#/definitions/useManagedIdentity", "default": false }, + "region": { "$ref": "#/definitions/region" } + }, + "allOf": [ + { + "dependencies": { + "passphrase": { + "anyOf": [ + { "not": {"required": [ "useManagedIdentity" ] } }, + { "properties": { "useManagedIdentity": { "const": false } } } + ] + } + } + }, + { + "if": { "not": { "required" : [ "useManagedIdentity"] } }, + "then": { "required": ["passphrase"] }, + "else": { + "if": { "properties": { "useManagedIdentity": { "const": true } } }, + "then": { "not": { "required": ["passphrase"] } }, + "else": { "required": ["passphrase"]} + } + } + ] + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Azure_Application_Insights" } } }, + "then": { + "properties": { + "instrumentationKey": { "$ref": "#/definitions/instrumentationKey" }, + "maxBatchSize": { "$ref": "#/definitions/maxBatchSize", "default": 250 }, + "maxBatchIntervalMs": { "$ref": "#/definitions/maxBatchIntervalMs", "default": 5000 }, + "customOpts": { "$ref": "#/definitions/customOpts" }, + "useManagedIdentity": { "$ref": "#/definitions/useManagedIdentity", "default": false }, + "appInsightsResourceName": { "$ref": "#/definitions/appInsightsResourceName" }, + "region": { "$ref": "#/definitions/region" } + }, + "allOf": [ + { + "dependencies": { + "instrumentationKey": { + "allOf": [ + { + "anyOf": [ + { "not": { "required": [ "useManagedIdentity" ] } }, + { "properties": { "useManagedIdentity": { "const": false } } } + ] + }, + { + "not": { "required": ["appInsightsResourceName"] } + } + ] + } + } + }, + { + "if": { "not": { "required" : [ "useManagedIdentity"] } }, + "then": { "required": ["instrumentationKey"] }, + "else": { + "if": { "properties": { "useManagedIdentity": { "const": true } } }, + "then": { "not": { "required": ["instrumentationKey"] } }, + "else": { + "allOf": [ + { "required": [ "instrumentationKey" ]}, + { "not": { "required": [ "appInsightsResourceName" ] } } + ] + } + } + }, + { + "if": { "required": [ "appInsightsResourceName" ] }, + "then": { "properties": { "appInsightsResourceName": { "minLength": 1 } }} + } + ] + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "AWS_CloudWatch" } } }, + "then": { + "required": [ + "region", + "dataType" + ], + "properties": { + "region": { "$ref": "#/definitions/region" }, + "dataType": { "$ref": "#/definitions/dataType", "default": "logs" }, + "username": { "$ref": "#/definitions/username" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" } + }, + "allOf": [ + { "not": { "required": ["username"], "not": { "required": ["passphrase"] }}}, + { "not": { "required": ["passphrase"], "not": { "required": ["username"] }}}, + { "oneOf": + [ + { + "allOf": [ + { + "properties": { + "logGroup": { "$ref": "#/definitions/logGroup" }, + "logStream": { "$ref": "#/definitions/logStream" }, + "dataType": { + "allOf": + [ + { "$ref": "#/definitions/dataType"}, + { "enum": ["logs", null] } + ] + } + } + }, + { "required":[ "logGroup", "logStream" ] }, + { "not": { "required": ["metricNamespace"] }} + ] + }, + { + "allOf": [ + { + "properties": { + "metricNamespace": { "$ref": "#/definitions/metricNamespace" }, + "dataType": { + "allOf": [ + { "$ref": "#/definitions/dataType"}, + { "enum": ["metrics"] } + ] + } + } + }, + { "required":[ "metricNamespace" ] }, + { "not": { "required":[ "logStream" ] }}, + { "not": { "required": [ "logGroup" ] }} + ] + } + ] + } + ] + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "AWS_S3" } } }, + "then": { + "required": [ + "region", + "bucket" + ], + "properties": { + "region": { "$ref": "#/definitions/region" }, + "bucket": { "$ref": "#/definitions/bucket" }, + "username": { "$ref": "#/definitions/username" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" } + }, + "dependencies": { + "passphrase": [ "username" ], + "username":[ "passphrase" ] + } + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Graphite" } } }, + "then": { + "required": [ + "host" + ], + "properties": { + "host": { "$ref": "#/definitions/host" }, + "protocol": { "$ref": "#/definitions/protocols", "default": "https" }, + "port": { "$ref": "#/definitions/port", "default": 443 }, + "path": { "$ref": "#/definitions/path", "default": "/events/" } + } + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Kafka" } } }, + "then": { + "required": [ + "host", + "topic" + ], + "properties": { + "authenticationProtocol": { "$ref": "#/definitions/authenticationProtocol", "default": "None" }, + "host": { "$ref": "#/definitions/host" }, + "protocol": { "$ref": "#/definitions/protocols", "default": "binaryTcpTls" }, + "port": { "$ref": "#/definitions/port", "default": 9092 }, + "topic": { "$ref": "#/definitions/topic" } + }, + "allOf": [ + { + "if": { "properties": { "authenticationProtocol": { "const": "SASL-PLAIN" } } }, + "then": { + "required": [ + "username" + ], + "properties": { + "username": { "$ref": "#/definitions/username" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" } + }, + "dependencies": { + "passphrase": [ "username" ] + } + }, + "else": {} + }, + { + "if": { "properties": { "authenticationProtocol": { "const": "TLS" } } }, + "then": { + "required": [ + "privateKey", + "clientCertificate" + ], + "allOf": [ + { "not": { "required": [ "username" ] } }, + { "not": { "required": [ "passphrase" ] } } + ], + "properties": { + "privateKey": { "$ref": "#/definitions/privateKey" }, + "clientCertificate": { "$ref": "#/definitions/clientCertificate" }, + "rootCertificate": { "$ref": "#/definitions/rootCertificate" }, + "protocol": { "const": "binaryTcpTls" } + } + }, + "else": {} + } + ] + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "ElasticSearch" } } }, + "then": { + "required": [ + "host", + "index" + ], + "properties": { + "host": { "$ref": "#/definitions/host" }, + "protocol": { "$ref": "#/definitions/protocols", "default": "https" }, + "port": { "$ref": "#/definitions/port", "default": 9200 }, + "path": { "$ref": "#/definitions/path" }, + "username": { "$ref": "#/definitions/username" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" }, + "apiVersion": { "$ref": "#/definitions/apiVersion"}, + "index": { "$ref": "#/definitions/index" }, + "dataType": { + "$ref": "#/definitions/dataType", + "default": "f5.telemetry", + "minLength": 1 + } + } + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Sumo_Logic" } } }, + "then": { + "required": [ + "host", + "passphrase" + ], + "properties": { + "host": { "$ref": "#/definitions/host" }, + "protocol": { "$ref": "#/definitions/protocols", "default": "https" }, + "port": { "$ref": "#/definitions/port", "default": 443 }, + "path": { "$ref": "#/definitions/path", "default": "/receiver/v1/http/" }, + "passphrase": { "$ref": "base_schema.json#/definitions/secret" } + } + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Statsd" } } }, + "then": { + "required": [ + "host" + ], + "properties": { + "host": { "$ref": "#/definitions/host" }, + "protocol": { + "title": "Protocol", + "type": "string", + "enum": [ "tcp", "udp" ], + "default": "udp" + }, + "port": { "$ref": "#/definitions/port", "default": 8125 }, + "addTags": { "$ref": "#/definitions/autoTaggingStatsd" } + } + }, + "else": {} + }, + { + "if": { + "properties": { "type": { "enum": ["Google_Cloud_Monitoring", "Google_StackDriver", "Google_Cloud_Logging"] } } + }, + "then": { + "required": [ + "privateKeyId", + "privateKey", + "serviceEmail" + ], + "properties": { + "privateKeyId": { "$ref": "#/definitions/privateKeyId" }, + "serviceEmail": { "$ref": "#/definitions/serviceEmail" }, + "privateKey": { "$ref": "base_schema.json#/definitions/secret" }, + "reportInstanceMetadata": { "$ref": "#/definitions/reportInstanceMetadata", "default": false } + }, + "allOf": [ + { + "if": { "properties": { "type": { "enum": ["Google_Cloud_Monitoring", "Google_StackDriver"] } } }, + "then": { + "properties": { + "projectId": { "$ref": "#/definitions/projectId"} + }, + "required": ["projectId"] + } + }, + { + "if": { "properties": { "type": { "const": "Google_Cloud_Logging" } } }, + "then": { + "properties": { + "logScope": { "$ref": "#/definitions/logScope", "default": "projects" }, + "logScopeId": { "$ref": "#/definitions/logScopeId"}, + "logId": { "$ref": "#/definitions/logId"} + }, + "required": ["logScope", "logScopeId", "logId"] + } + } + ] + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "F5_Cloud" } } }, + "then": { + "required": [ + "f5csTenantId", + "f5csSensorId", + "payloadSchemaNid", + "serviceAccount", + "targetAudience" + ], + "properties": { + "port": { "$ref": "#/definitions/port", "default": 443 }, + "eventSchemaVersion": { "$ref": "#/definitions/eventSchemaVersion" }, + "f5csTenantId": { "$ref": "#/definitions/f5csTenantId" }, + "f5csSensorId": { "$ref": "#/definitions/f5csSensorId" }, + "payloadSchemaNid": { "$ref": "#/definitions/payloadSchemaNid" }, + "serviceAccount": { "$ref": "#/definitions/serviceAccount" }, + "targetAudience": { "$ref": "#/definitions/targetAudience" }, + "useSSL": { "$ref": "#/definitions/useSSL", "default": true } + }, + "nodeSupportVersion": "8.11.1" + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "DataDog" } } }, + "then": { + "required": [ + "apiKey" + ], + "properties": { + "apiKey": { "$ref": "#/definitions/apiKey" } + } + }, + "else": {} + } + ] + }, + "else": {} + } + ] +} diff --git a/src/schema/1.22.0/controls_schema.json b/src/schema/1.22.0/controls_schema.json new file mode 100644 index 00000000..2bbfcff8 --- /dev/null +++ b/src/schema/1.22.0/controls_schema.json @@ -0,0 +1,52 @@ +{ + "$id": "controls_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming Controls schema", + "description": "", + "type": "object", + "allOf": [ + { + "if": { "properties": { "class": { "const": "Controls" } } }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Controls class", + "type": "string", + "enum": [ "Controls" ] + }, + "logLevel": { + "title": "Logging Level", + "description": "", + "type": "string", + "default": "info", + "enum": [ + "debug", + "info", + "error" + ] + }, + "debug": { + "title": "Enable debug mode", + "description": "", + "type": "boolean", + "default": false + }, + "memoryThresholdPercent": { + "title": "Memory Usage Threshold (Percentage of Available Process Memory)", + "description": "Once memory usage reaches this value, processing may temporarily cease until levels return below threshold. Defaults to 90%", + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 90 + } + }, + "additionalProperties": false + }, + "else": {} + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/endpoints_schema.json b/src/schema/1.22.0/endpoints_schema.json new file mode 100644 index 00000000..73fc5ee7 --- /dev/null +++ b/src/schema/1.22.0/endpoints_schema.json @@ -0,0 +1,158 @@ +{ + "$id": "endpoints_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming Endpoints schema", + "description": "", + "type": "object", + "definitions": { + "endpoint": { + "title": "Telemetry Endpoint", + "description": "", + "type": "object", + "properties": { + "enable": { + "title": "Enable endpoint", + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "name": { + "title": "Endpoint name", + "type": "string", + "minLength": 1 + }, + "path": { + "title": "Path to query data from", + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "endpoints": { + "title": "Telemetry Endpoints", + "description": "", + "type": "object", + "properties": { + "enable": { + "title": "Enable endpoints", + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "basePath": { + "title": "Base Path", + "description": "Optional base path value to prepend to each individual endpoint paths", + "type": "string", + "default": "" + }, + "items": { + "title": "Items", + "description": "Object with each property an endpoint with their own properties", + "type": "object", + "additionalProperties": { + "allOf": [ + { + "$ref": "#/definitions/endpoint" + }, + { + "required": [ "path" ] + } + ] + }, + "minProperties": 1 + } + } + }, + "endpointsObjectRef": { + "allOf": [ + { + "$ref": "#/definitions/endpoints" + }, + { + "properties": { + "enable": {}, + "basePath": {}, + "items": {} + }, + "required": [ "items" ], + "additionalProperties": false + } + ] + }, + "endpointObjectRef": { + "allOf": [ + { + "$ref": "#/definitions/endpoint" + }, + { + "properties": { + "enable": {}, + "name": {}, + "path": {} + }, + "required": [ "name", "path" ], + "additionalProperties": false + } + ] + }, + "endpointsPointerRef": { + "title": "Telemetry_Endpoints Name", + "description": "Name of the Telemetry_Endpoints object", + "type": "string", + "declarationClass": "Telemetry_Endpoints", + "minLength": 1 + }, + "endpointsItemPointerRef": { + "title": "Telemetry_Endpoints Name and Item Key", + "description": "Name of the Telemetry_Endpoints object and the endpoint item key, e.g endpointsA/item1", + "type": "string", + "declarationClassProp": { + "path" :"Telemetry_Endpoints/items", + "partsNum": 2 + }, + "minLength": 1 + } + }, + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_Endpoints" } } }, + "then": { + "required": [ + "class", + "items" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Endpoints class", + "type": "string", + "enum": [ "Telemetry_Endpoints" ] + } + }, + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "class": {}, + "enable": {}, + "basePath": {}, + "items": {} + }, + "additionalProperties": false + }, + { + "$ref": "#/definitions/endpoints" + } + ] + }, + "else": {} + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/ihealth_poller_schema.json b/src/schema/1.22.0/ihealth_poller_schema.json new file mode 100644 index 00000000..d5bcb9cf --- /dev/null +++ b/src/schema/1.22.0/ihealth_poller_schema.json @@ -0,0 +1,238 @@ +{ + "$id": "ihealth_poller_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming iHealth Poller schema", + "description": "", + "type": "object", + "definitions": { + "time24hr": { + "title": "Time in HH:MM, 24hr", + "description": "", + "type": "string", + "pattern": "^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]?$" + }, + "iHealthPoller": { + "$comment": "system_schema.json should be updated when new property added", + "title": "iHealth Poller", + "description": "", + "type": "object", + "required": [ + "interval", + "username", + "passphrase" + ], + "properties": { + "enable": { + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "trace": { + "default": false, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/trace" + } + ] + }, + "proxy": { + "title": "Proxy configuration", + "properties": { + "port": { + "default": 80 + }, + "protocol": { + "default": "http" + } + }, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/proxy" + } + ] + }, + "username": { + "title": "iHealth Username", + "$ref": "base_schema.json#/definitions/username" + }, + "passphrase": { + "title": "iHealth Passphrase", + "$ref": "base_schema.json#/definitions/secret" + }, + "downloadFolder": { + "title": "Directory to download Qkview to", + "description": "", + "type": "string", + "minLength": 1, + "pathExists": true + }, + "interval": { + "title": "Operating interval", + "description": "" , + "type": "object", + "properties": { + "timeWindow": { + "title": "Two or more hours window in 24hr format that iHealth data can be sent", + "description": "", + "type": "object", + "properties": { + "start": { + "title": "Time when the window starts", + "$ref": "#/definitions/time24hr" + }, + "end": { + "title": "Time when the window ends", + "$ref": "#/definitions/time24hr" + } + }, + "timeWindowMinSize": 120, + "required": [ "start", "end" ], + "additionalProperties": false + }, + "frequency": { + "title": "Interval frequency", + "description": "", + "type": "string", + "default": "daily", + "enum": [ + "daily", + "weekly", + "monthly" + ] + } + + }, + "required": [ + "timeWindow" + ], + "allOf": [ + { + "if": { "properties": { "frequency": { "const": "daily" } } }, + "then": { + "properties": { + "timeWindow": {}, + "frequency": {} + }, + "additionalProperties": false + } + }, + { + "if": { "properties": { "frequency": { "const": "weekly" } } }, + "then": { + "properties": { + "timeWindow": {}, + "frequency": {}, + "day": { + "title": "", + "description": "", + "oneOf": [ + { + "type": "string", + "pattern": "^([mM]onday|[tT]uesday|[wW]ednesday|[tT]hursday|[fF]riday|[sS]aturday|[sS]unday)$" + }, + { + "$comment": "0 and 7 eq. Sunday", + "type": "integer", + "minimum": 0, + "maximum": 7 + } + ] + } + }, + "required": [ "day" ], + "additionalProperties": false + } + }, + { + "if": { "properties": { "frequency": { "const": "monthly" } } }, + "then": { + "properties": { + "timeWindow": {}, + "frequency": {}, + "day": { + "title": "", + "description": "", + "type": "integer", + "minimum": 1, + "maximum": 31 + } + }, + "required": [ "day" ], + "additionalProperties": false + } + } + ] + } + } + }, + "iHealthPollerPointerRef": { + "type": "string", + "minLength": 1, + "declarationClass": "Telemetry_iHealth_Poller" + }, + "iHealthPollerObjectRef": { + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "enable": {}, + "trace": {}, + "interval": {}, + "proxy": {}, + "username": {}, + "passphrase": {}, + "downloadFolder": {} + }, + "additionalProperties": false + }, + { + "$ref": "ihealth_poller_schema.json#/definitions/iHealthPoller" + } + ] + } + }, + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_iHealth_Poller" } } }, + "then": { + "required": [ + "class", + "username", + "passphrase" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming iHealth Poller class", + "type": "string", + "enum": [ "Telemetry_iHealth_Poller" ] + } + }, + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "class": {}, + "enable": {}, + "trace": {}, + "interval": {}, + "proxy": {}, + "username": {}, + "passphrase": {}, + "downloadFolder": {} + }, + "additionalProperties": false + }, + { + "$ref": "#/definitions/iHealthPoller" + } + ] + }, + "else": {}, + "$comment": "Telemetry_iHealth_Poller should be either built-in within Telemetry_System or referenced by Telemetry_System(s), otherwise it will be treated as disabled" + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/listener_schema.json b/src/schema/1.22.0/listener_schema.json new file mode 100644 index 00000000..d3b9434e --- /dev/null +++ b/src/schema/1.22.0/listener_schema.json @@ -0,0 +1,85 @@ +{ + "$id": "listener_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming event listener schema", + "description": "", + "type": "object", + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_Listener" } } }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Event Listener class", + "type": "string", + "enum": [ "Telemetry_Listener" ] + }, + "enable": { + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "trace": { + "default": false, + "oneOf": [ + { + "$ref": "base_schema.json#/definitions/trace" + }, + { + "$ref": "base_schema.json#/definitions/traceV2" + } + ] + }, + "port": { + "minimum": 1024, + "maximum": 65535, + "default": 6514, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/port" + } + ] + }, + "tag": { + "$comment": "Deprecated! Use actions with a setTag action.", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/tag" + } + ] + }, + "match": { + "default": "", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/match" + } + ] + }, + "actions": { + "title": "Actions", + "description": "Actions to be performed on the listener.", + "default": [ + { + "setTag": { + "tenant": "`T`", + "application": "`A`" + } + } + ], + "allOf": [{ "$ref": "actions_schema.json#/definitions/inputDataStreamActionsChain" }] + } + }, + "additionalProperties": false + }, + "else": {} + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/namespace_schema.json b/src/schema/1.22.0/namespace_schema.json new file mode 100644 index 00000000..f6cb09fc --- /dev/null +++ b/src/schema/1.22.0/namespace_schema.json @@ -0,0 +1,92 @@ +{ + "$id": "namespace_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming Namespace schema", + "description": "", + "type": "object", + "definitions": { + "namespace": { + "required": [ + "class" + ], + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Namespace class", + "type": "string", + "enum": [ "Telemetry_Namespace" ] + } + }, + "additionalProperties": { + "$comment": "All objects supported under a Telemetry Namespace", + "properties": { + "class": { + "title": "Class", + "type": "string", + "enum": [ + "Telemetry_System", + "Telemetry_System_Poller", + "Telemetry_Listener", + "Telemetry_Consumer", + "Telemetry_Pull_Consumer", + "Telemetry_iHealth_Poller", + "Telemetry_Endpoints", + "Shared" + ] + } + }, + "allOf": [ + { + "$ref": "system_schema.json#" + }, + { + "$ref": "system_poller_schema.json#" + }, + { + "$ref": "listener_schema.json#" + }, + { + "$ref": "consumer_schema.json#" + }, + { + "$ref": "pull_consumer_schema.json#" + }, + { + "$ref": "ihealth_poller_schema.json#" + }, + { + "$ref": "endpoints_schema.json#" + }, + { + "$ref": "shared_schema.json#" + } + ] + } + } + }, + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_Namespace" } } }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Namespace class", + "type": "string", + "enum": [ "Telemetry_Namespace" ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/namespace" + } + ] + }, + "else": {} + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/pull_consumer_schema.json b/src/schema/1.22.0/pull_consumer_schema.json new file mode 100644 index 00000000..0747cbfd --- /dev/null +++ b/src/schema/1.22.0/pull_consumer_schema.json @@ -0,0 +1,101 @@ +{ + "$id": "pull_consumer_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming Pull Consumer schema", + "description": "", + "type": "object", + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_Pull_Consumer" } } }, + "then": { + "required": [ + "class", + "type", + "systemPoller" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming Pull Consumer class", + "type": "string", + "enum": [ "Telemetry_Pull_Consumer" ] + }, + "enable": { + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "trace": { + "default": false, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/trace" + } + ] + }, + "type": { + "title": "Type", + "description": "" , + "type": "string", + "enum": [ + "default", + "Prometheus" + ] + }, + "systemPoller": { + "title": "Pointer to System Poller(s)", + "anyOf": [ + { + "$ref": "system_poller_schema.json#/definitions/systemPollerPointerRef" + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "system_poller_schema.json#/definitions/systemPollerPointerRef" + } + ] + }, + "minItems": 1 + } + ] + } + }, + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "class": {}, + "enable": {}, + "trace": {}, + "type": {}, + "systemPoller": {} + }, + "additionalProperties": false + }, + { + "if": { "properties": { "type": { "const": "default" } } }, + "then": { + "required": [], + "properties": {} + }, + "else": {} + }, + { + "if": { "properties": { "type": { "const": "Prometheus" } } }, + "then": { + "required": [], + "properties": {} + }, + "else": {} + } + ] + }, + "else": {} + } + ] +} diff --git a/src/schema/1.22.0/shared_schema.json b/src/schema/1.22.0/shared_schema.json new file mode 100644 index 00000000..aa96cb2e --- /dev/null +++ b/src/schema/1.22.0/shared_schema.json @@ -0,0 +1,50 @@ +{ + "$id": "shared_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry streaming Shared schema", + "description": "", + "type": "object", + "allOf": [ + { + "if": { "properties": { "class": { "const": "Shared" } } }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry streaming Shared class", + "type": "string", + "enum": [ "Shared" ] + } + }, + "additionalProperties": { + "properties": { + "class": { + "title": "Class", + "type": "string", + "enum": [ + "Constants", + "Secret" + ] + } + }, + "allOf": [ + { + "if": { "properties": { "class": { "const": "Constants" } } }, + "then": { "$ref": "base_schema.json#/definitions/constants" }, + "else": {} + }, + { + "if": { "properties": { "class": { "const": "Secret" } } }, + "then": { "$ref": "base_schema.json#/definitions/secret" }, + "else": {} + } + ] + } + }, + "else": {} + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/system_poller_schema.json b/src/schema/1.22.0/system_poller_schema.json new file mode 100644 index 00000000..dcb3a454 --- /dev/null +++ b/src/schema/1.22.0/system_poller_schema.json @@ -0,0 +1,242 @@ +{ + "$id": "system_poller_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming system poller schema", + "description": "", + "type": "object", + "definitions": { + "systemPoller": { + "$comment": "system_schema.json should be updated when new property added", + "title": "System Poller", + "description": "", + "type": "object", + "properties": { + "enable": { + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "interval": { + "title": "Collection interval (in seconds)", + "description": "If endpointList is specified, minimum=1. Without endpointList, minimum=60 and maximum=60000. Allows setting interval=0 to not poll on an interval.", + "type": "integer", + "default": 300 + }, + "trace": { + "$ref": "base_schema.json#/definitions/trace" + }, + "tag": { + "$comment": "Deprecated! Use actions with a setTag action.", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/tag" + } + ] + }, + "actions": { + "title": "Actions", + "description": "Actions to be performed on the systemPoller.", + "default": [ + { + "setTag": { + "tenant": "`T`", + "application": "`A`" + } + } + ], + "allOf": [{ "$ref": "actions_schema.json#/definitions/inputDataStreamActionsChain" }] + }, + "endpointList": { + "title": "Endpoint List", + "description": "List of endpoints to use in data collection", + "oneOf": [ + { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "endpoints_schema.json#/definitions/endpointsPointerRef" + }, + { + "$ref": "endpoints_schema.json#/definitions/endpointsItemPointerRef" + }, + { + "if": { "required": [ "items" ]}, + "then": { + "$ref": "endpoints_schema.json#/definitions/endpointsObjectRef" + }, + "else": { + "$ref": "endpoints_schema.json#/definitions/endpointObjectRef" + } + } + + ] + }, + "minItems": 1 + }, + { + "$ref": "endpoints_schema.json#/definitions/endpointsPointerRef" + }, + { + "$ref": "endpoints_schema.json#/definitions/endpointsObjectRef" + } + ] + } + }, + "oneOf": [ + { + "allOf": [ + { + "if": { "required": [ "endpointList" ] }, + "then": { + "properties": { + "interval": { + "minimum": 1 + } + } + }, + "else": { + "properties":{ + "interval": { + "minimum": 60, + "maximum": 6000 + } + } + } + } + ] + }, + { + "allOf": [ + { + "properties": { + "interval": { + "enum": [0] + } + } + } + ] + } + ] + }, + "systemPollerPointerRef": { + "type": "string", + "minLength": 1, + "declarationClass": "Telemetry_System_Poller" + }, + "systemPollerObjectRef": { + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "enable": {}, + "trace": {}, + "interval": {}, + "tag": {}, + "actions": {}, + "endpointList": {} + }, + "additionalProperties": false + }, + { + "$ref": "#/definitions/systemPoller" + } + ] + } + }, + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_System_Poller" } } }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming System Poller class", + "type": "string", + "enum": [ "Telemetry_System_Poller" ] + }, + "host": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "default": "localhost", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/host" + } + ] + }, + "port": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "default": 8100, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/port" + } + ] + }, + "protocol": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "default": "http", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/protocol" + } + ] + }, + "allowSelfSignedCert": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "title": "Allow Self-Signed Certificate", + "default": false, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/allowSelfSignedCert" + } + ] + }, + "enableHostConnectivityCheck": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "$ref": "base_schema.json#/definitions/enableHostConnectivityCheck" + }, + "username": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "$ref": "base_schema.json#/definitions/username" + }, + "passphrase": { + "$comment": "Deprecated! Use Telemetry_System to define target device", + "$ref": "base_schema.json#/definitions/secret" + } + }, + "allOf": [ + { + "$comment": "This allows enforcement of no additional properties in this nested schema - could reuse above properties but prefer a separate block", + "properties": { + "class": {}, + "enable": {}, + "trace": {}, + "interval": {}, + "tag": {}, + "host": {}, + "port": {}, + "protocol": {}, + "allowSelfSignedCert": {}, + "enableHostConnectivityCheck": {}, + "username": {}, + "passphrase": {}, + "actions": {}, + "endpointList": {} + }, + "additionalProperties": false + }, + { + "$ref": "#/definitions/systemPoller" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/schema/1.22.0/system_schema.json b/src/schema/1.22.0/system_schema.json new file mode 100644 index 00000000..cba58faa --- /dev/null +++ b/src/schema/1.22.0/system_schema.json @@ -0,0 +1,121 @@ +{ + "$id": "system_schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Telemetry Streaming System schema", + "description": "", + "type": "object", + "allOf": [ + { + "if": { "properties": { "class": { "const": "Telemetry_System" } } }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "title": "Class", + "description": "Telemetry Streaming System class", + "type": "string", + "enum": [ "Telemetry_System" ] + }, + "enable": { + "title": "Enable all pollers attached to device", + "default": true, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/enable" + } + ] + }, + "trace": { + "$ref": "base_schema.json#/definitions/trace" + }, + "host": { + "title": "System connection address", + "default": "localhost", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/host" + } + ] + }, + "port": { + "title": "System connection port", + "default": 8100, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/port" + } + ] + }, + "protocol": { + "title": "System connection protocol", + "default": "http", + "allOf": [ + { + "$ref": "base_schema.json#/definitions/protocol" + } + ] + }, + "allowSelfSignedCert": { + "title": "Allow Self-Signed Certificate", + "default": false, + "allOf": [ + { + "$ref": "base_schema.json#/definitions/allowSelfSignedCert" + } + ] + }, + "enableHostConnectivityCheck": { + "$ref": "base_schema.json#/definitions/enableHostConnectivityCheck" + }, + "username": { + "title": "System Username", + "$ref": "base_schema.json#/definitions/username" + }, + "passphrase": { + "title": "System Passphrase", + "$ref": "base_schema.json#/definitions/secret" + }, + "systemPoller": { + "title": "System Poller declaration", + "oneOf": [ + { + "$ref": "system_poller_schema.json#/definitions/systemPollerPointerRef" + }, + { + "$ref": "system_poller_schema.json#/definitions/systemPollerObjectRef" + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "system_poller_schema.json#/definitions/systemPollerObjectRef" + }, + { + "$ref": "system_poller_schema.json#/definitions/systemPollerPointerRef" + } + ] + }, + "minItems": 1 + } + ] + }, + "iHealthPoller": { + "title": "iHealth Poller declaration", + "oneOf": [ + { + "$ref": "ihealth_poller_schema.json#/definitions/iHealthPollerPointerRef" + }, + { + "$ref": "ihealth_poller_schema.json#/definitions/iHealthPollerObjectRef" + } + ] + } + }, + "additionalProperties": false + } + } + ] +} \ No newline at end of file diff --git a/src/schema/latest/base_schema.json b/src/schema/latest/base_schema.json index 13906595..d94af2cf 100644 --- a/src/schema/latest/base_schema.json +++ b/src/schema/latest/base_schema.json @@ -242,8 +242,8 @@ "description": "Version of ADC Declaration schema this declaration uses", "type": "string", "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", - "enum": [ "1.21.0", "1.20.1", "1.20.0", "1.19.0", "1.18.0", "1.17.0", "1.16.0", "1.15.0", "1.14.0", "1.13.0", "1.12.0", "1.11.0", "1.10.0", "1.9.0", "1.8.0", "1.7.0", "1.6.0", "1.5.0", "1.4.0", "1.3.0", "1.2.0", "1.1.0", "1.0.0", "0.9.0" ], - "default": "1.21.0" + "enum": [ "1.22.0", "1.21.0", "1.20.1", "1.20.0", "1.19.0", "1.18.0", "1.17.0", "1.16.0", "1.15.0", "1.14.0", "1.13.0", "1.12.0", "1.11.0", "1.10.0", "1.9.0", "1.8.0", "1.7.0", "1.6.0", "1.5.0", "1.4.0", "1.3.0", "1.2.0", "1.1.0", "1.0.0", "0.9.0" ], + "default": "1.22.0" }, "$schema": { "title": "Schema", diff --git a/src/schema/latest/consumer_schema.json b/src/schema/latest/consumer_schema.json index d19c596f..6d218f36 100644 --- a/src/schema/latest/consumer_schema.json +++ b/src/schema/latest/consumer_schema.json @@ -373,7 +373,7 @@ "f5expand": true }, "serviceEmail": { - "$comment": "Required for certain consumers: Google_Cloud_Monitoring", + "$comment": "Required for certain consumers: Google_Cloud_Monitoring, Google_Cloud_Logging", "title": "Service Email", "description": "The service email.", "type": "string", @@ -381,13 +381,38 @@ "f5expand": true }, "privateKeyId": { - "$comment": "Required for certain consumers: Google_Cloud_Monitoring", + "$comment": "Required for certain consumers: Google_Cloud_Monitoring, Google_Cloud_Logging", "title": "Private Key ID", "description": "The private key ID.", "type": "string", "minLength": 1, "f5expand": true }, + "logScope": { + "$comment": "Required for certain consumers: Google_Cloud_Logging", + "title": "Logging Scope Type", + "description": "" , + "enum": ["projects", "organizations", "billingAccounts", "folders"], + "f5expand": true + }, + "logScopeId": { + "$comment": "Required for certain consumers: Google_Cloud_Logging", + "title": "Logging Scope ID", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true + }, + "logId": { + "$comment": "Required for certain consumers: Google_Cloud_Logging", + "title": "Logging ID", + "description": "" , + "type": "string", + "format": "regex", + "pattern": "^[a-zA-z0-9._-]+$", + "minLength": 1, + "f5expand": true + }, "privateKey": { "$comment": "Required for certain consumers: Kafka, Generic HTTP", "title": "Private Key", @@ -400,6 +425,15 @@ } ] }, + "eventSchemaVersion": { + "$comment": "Required for certain consumers: F5_Cloud", + "title": "Event Schema Version", + "description": "" , + "type": "string", + "minLength": 1, + "f5expand": true, + "default": "1" + }, "f5csTenantId": { "$comment": "Required for certain consumers: F5_Cloud", "title": "F5CS Tenant ID", @@ -555,6 +589,20 @@ "description": "Whether or not to compress data and what compression to use before sending it to destination", "type": "string", "enum": ["none", "gzip"] + }, + "reportInstanceMetadata": { + "$comment": "Required for certain consumers: Google_Cloud_Monitoring, Google_Cloud_Logging", + "title": "Instance metadata reporting", + "description": "Enables instance metadata collection and reporting" , + "type": "boolean", + "f5expand": true + }, + "apiKey": { + "$comment": "Required for certain consumers: DataDog", + "title": "API key to use to push data", + "type": "string", + "minLength": 1, + "f5expand": true } }, "allOf": [ @@ -597,9 +645,11 @@ "AWS_S3", "Azure_Log_Analytics", "Azure_Application_Insights", + "DataDog", "default", "ElasticSearch", "Generic_HTTP", + "Google_Cloud_Logging", "Google_Cloud_Monitoring", "Google_StackDriver", "Graphite", @@ -628,6 +678,7 @@ "properties": { "addTags": {}, "actions": {}, + "apiKey": {}, "class": {}, "enable": {}, "trace": {}, @@ -667,6 +718,7 @@ "clientCertificate": {}, "rootCertificate": {}, "fallbackHosts": {}, + "eventSchemaVersion": {}, "f5csTenantId": {}, "f5csSensorId": {}, "payloadSchemaNid": {}, @@ -674,7 +726,11 @@ "targetAudience": {}, "useSSL": {}, "proxy": {}, - "compressionType": {} + "compressionType": {}, + "logScope": {}, + "logScopeId": {}, + "logId": {}, + "reportInstanceMetadata": {} }, "additionalProperties": false, "dependencies": { @@ -1060,11 +1116,10 @@ }, { "if": { - "properties": { "type": { "enum": ["Google_Cloud_Monitoring", "Google_StackDriver"] } } + "properties": { "type": { "enum": ["Google_Cloud_Monitoring", "Google_StackDriver", "Google_Cloud_Logging"] } } }, "then": { "required": [ - "projectId", "privateKeyId", "privateKey", "serviceEmail" @@ -1073,8 +1128,30 @@ "privateKeyId": { "$ref": "#/definitions/privateKeyId" }, "serviceEmail": { "$ref": "#/definitions/serviceEmail" }, "privateKey": { "$ref": "base_schema.json#/definitions/secret" }, - "projectId": { "$ref": "#/definitions/projectId" } - } + "reportInstanceMetadata": { "$ref": "#/definitions/reportInstanceMetadata", "default": false } + }, + "allOf": [ + { + "if": { "properties": { "type": { "enum": ["Google_Cloud_Monitoring", "Google_StackDriver"] } } }, + "then": { + "properties": { + "projectId": { "$ref": "#/definitions/projectId"} + }, + "required": ["projectId"] + } + }, + { + "if": { "properties": { "type": { "const": "Google_Cloud_Logging" } } }, + "then": { + "properties": { + "logScope": { "$ref": "#/definitions/logScope", "default": "projects" }, + "logScopeId": { "$ref": "#/definitions/logScopeId"}, + "logId": { "$ref": "#/definitions/logId"} + }, + "required": ["logScope", "logScopeId", "logId"] + } + } + ] }, "else": {} }, @@ -1090,6 +1167,7 @@ ], "properties": { "port": { "$ref": "#/definitions/port", "default": 443 }, + "eventSchemaVersion": { "$ref": "#/definitions/eventSchemaVersion" }, "f5csTenantId": { "$ref": "#/definitions/f5csTenantId" }, "f5csSensorId": { "$ref": "#/definitions/f5csSensorId" }, "payloadSchemaNid": { "$ref": "#/definitions/payloadSchemaNid" }, @@ -1100,6 +1178,18 @@ "nodeSupportVersion": "8.11.1" }, "else": {} + }, + { + "if": { "properties": { "type": { "const": "DataDog" } } }, + "then": { + "required": [ + "apiKey" + ], + "properties": { + "apiKey": { "$ref": "#/definitions/apiKey" } + } + }, + "else": {} } ] }, diff --git a/test/functional/deployment/declaration.yml b/test/functional/deployment/declaration.yml index d058fb04..33fff80f 100644 --- a/test/functional/deployment/declaration.yml +++ b/test/functional/deployment/declaration.yml @@ -45,6 +45,13 @@ request: _copy: request/software/bigip_16_0 type: bigip flavor: F5-BIGIP-small + - harness: + _copy: request/hypervisor + name: bigip_16_1 + software: + _copy: request/software/bigip_16_1 + type: bigip + flavor: F5-BIGIP-small hypervisor: VIO software: bigip_13_1: @@ -53,33 +60,42 @@ request: image: BIGIP-13.0.0.0.0.1650 desired: branch: '' - build: 0.0.4 + build: 0.0.3 iso_file: '' - version: 13.1.3.6 + version: 13.1.4.1 bigip_14_1: default: force: false image: BIGIP-13.0.0.0.0.1650 desired: branch: '' - build: 0.0.4 + build: 0.0.8 iso_file: '' - version: 14.1.4.1 + version: 14.1.4.3 bigip_15_1: default: force: false image: BIGIP-13.0.0.0.0.1650 desired: branch: '' - build: 0.0.7 + build: 0.0.18 iso_file: '' - version: 15.1.2.1 + version: 15.1.3.1 bigip_16_0: default: force: false image: BIGIP-16.0.0-0.0.12 desired: branch: '' - build: 0.0.6 + build: 0.0.8 + iso_file: '' + version: 16.0.1.2 + bigip_16_1: + default: + force: false + image: BIGIP-16.0.0-0.0.12 + desired: + branch: '' + build: 0.0.19 iso_file: '' - version: 16.0.1.1 \ No newline at end of file + version: 16.1.0 \ No newline at end of file diff --git a/test/unit/configTests.js b/test/unit/configTests.js index a0791e9f..ea9bb101 100644 --- a/test/unit/configTests.js +++ b/test/unit/configTests.js @@ -72,8 +72,8 @@ describe('Config', () => { mappings: {}, components: [{ name: 'My_Consumer', - traceName: 'My_Consumer', - id: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', + id: 'f5telemetry_default::My_Consumer', class: 'Telemetry_Consumer', type: 'default', enable: true, @@ -81,7 +81,7 @@ describe('Config', () => { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false, @@ -133,16 +133,16 @@ describe('Config', () => { components: [{ class: 'Telemetry_Consumer', type: 'default', - id: 'My_Consumer', + id: 'f5telemetry_default::My_Consumer', name: 'My_Consumer', namespace: 'f5telemetry_default', - traceName: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', enable: true, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false @@ -345,16 +345,16 @@ describe('Config', () => { components: [{ class: 'Telemetry_Consumer', type: 'default', - id: 'My_Consumer', + id: 'f5telemetry_default::My_Consumer', name: 'My_Consumer', namespace: 'f5telemetry_default', - traceName: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', enable: true, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false diff --git a/test/unit/consumers/data/azureLogAnalyticsConsumerTestsData.js b/test/unit/consumers/data/azureLogAnalyticsConsumerTestsData.js index 12485b8e..51ba97c1 100644 --- a/test/unit/consumers/data/azureLogAnalyticsConsumerTestsData.js +++ b/test/unit/consumers/data/azureLogAnalyticsConsumerTestsData.js @@ -363,9 +363,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '10.5.6.7:80', enabledState: 'enabled', @@ -393,9 +395,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '192.0.2.11:443', enabledState: 'enabled', @@ -413,9 +417,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '192.0.2.11:80', enabledState: 'enabled', @@ -438,7 +444,7 @@ module.exports = { ], fullURI: 'https://myWorkspace.ods.opinsights.azure.com/api/logs?api-version=2016-04-01', headers: { - Authorization: 'SharedKey myWorkspace:fXbTcwglyeCjGtg2DLxT6ZgotDRZqDMMs7+7ZCV8bhc=', + Authorization: 'SharedKey myWorkspace:jVwsICVnUV3jSoXSPImXFeWC14MWlB/CgInCUSObMis=', 'Content-Type': 'application/json', 'Log-Type': 'F5Telemetry_virtualServers', 'x-ms-date': 'Thu, 01 Jan 1970 00:00:00 GMT' diff --git a/test/unit/consumers/data/splunkConsumerTestsData.js b/test/unit/consumers/data/splunkConsumerTestsData.js index 9407a20f..d376b6c5 100644 --- a/test/unit/consumers/data/splunkConsumerTestsData.js +++ b/test/unit/consumers/data/splunkConsumerTestsData.js @@ -1526,9 +1526,11 @@ module.exports = { 'metric_name:clientside.bitsIn': 0, 'metric_name:clientside.bitsOut': 0, 'metric_name:clientside.curConns': 0, + 'metric_name:clientside.evictedConns': 0, 'metric_name:clientside.maxConns': 0, 'metric_name:clientside.pktsIn': 0, 'metric_name:clientside.pktsOut': 0, + 'metric_name:clientside.slowKilled': 0, 'metric_name:clientside.totConns': 0, name: '/Common/app.app/app_vs', pool: '/Common/foofoo.app/foofoo_pool', @@ -1552,9 +1554,11 @@ module.exports = { 'metric_name:clientside.bitsIn': 0, 'metric_name:clientside.bitsOut': 0, 'metric_name:clientside.curConns': 0, + 'metric_name:clientside.evictedConns': 0, 'metric_name:clientside.maxConns': 0, 'metric_name:clientside.pktsIn': 0, 'metric_name:clientside.pktsOut': 0, + 'metric_name:clientside.slowKilled': 0, 'metric_name:clientside.totConns': 0, name: '/Example_Tenant/A1/serviceMain', pool: '/Example_Tenant/A1/barbar_pool', @@ -1576,9 +1580,11 @@ module.exports = { 'metric_name:clientside.bitsIn': 0, 'metric_name:clientside.bitsOut': 0, 'metric_name:clientside.curConns': 0, + 'metric_name:clientside.evictedConns': 0, 'metric_name:clientside.maxConns': 0, 'metric_name:clientside.pktsIn': 0, 'metric_name:clientside.pktsOut': 0, + 'metric_name:clientside.slowKilled': 0, 'metric_name:clientside.totConns': 0, name: '/Example_Tenant/A1/serviceMain-Redirect', 'status.statusReason': 'The children pool member(s) either don\'t have service checking enabled, or service check results are not available yet', diff --git a/test/unit/consumers/data/statsdConsumerTestsData.js b/test/unit/consumers/data/statsdConsumerTestsData.js index ddceecce..e9c76031 100644 --- a/test/unit/consumers/data/statsdConsumerTestsData.js +++ b/test/unit/consumers/data/statsdConsumerTestsData.js @@ -717,6 +717,23 @@ module.exports = { application: 'foofoo.app' } }, + { + metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Common-app-app-app_vs.clientside-evictedConns', + metricValue: 0, + metricTags: { + destination: '10.5.6.7:80', + availabilityState: 'offline', + enabledState: 'enabled', + 'status.statusReason': 'The virtual server is available', + mask: '255.255.255.255', + name: '/Common/foofoo.app/foofoo_vs', + appService: '/Common/foofoo.app/foofoo', + ipProtocol: 'tcp', + tenant: 'Common', + pool: '/Common/foofoo.app/foofoo_pool', + application: 'foofoo.app' + } + }, { metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Common-app-app-app_vs.clientside-maxConns', metricValue: 0, @@ -768,6 +785,23 @@ module.exports = { application: 'foofoo.app' } }, + { + metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Common-app-app-app_vs.clientside-slowKilled', + metricValue: 0, + metricTags: { + destination: '10.5.6.7:80', + availabilityState: 'offline', + enabledState: 'enabled', + 'status.statusReason': 'The virtual server is available', + mask: '255.255.255.255', + name: '/Common/foofoo.app/foofoo_vs', + appService: '/Common/foofoo.app/foofoo', + ipProtocol: 'tcp', + tenant: 'Common', + pool: '/Common/foofoo.app/foofoo_pool', + application: 'foofoo.app' + } + }, { metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Common-app-app-app_vs.clientside-totConns', metricValue: 0, @@ -833,6 +867,22 @@ module.exports = { application: 'A1' } }, + { + metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain.clientside-evictedConns', + metricValue: 0, + metricTags: { + destination: '192.0.2.11:443', + availabilityState: 'offline', + enabledState: 'enabled', + 'status.statusReason': 'The children pool member(s) either don\'t have service checking enabled, or service check results are not available yet', + mask: '255.255.255.0', + name: '/Example_Tenant/A1/serviceMain', + ipProtocol: 'tcp', + tenant: 'Example_Tenant', + pool: '/Example_Tenant/A1/barbar_pool', + application: 'A1' + } + }, { metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain.clientside-maxConns', metricValue: 0, @@ -881,6 +931,22 @@ module.exports = { application: 'A1' } }, + { + metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain.clientside-slowKilled', + metricValue: 0, + metricTags: { + destination: '192.0.2.11:443', + availabilityState: 'offline', + enabledState: 'enabled', + 'status.statusReason': 'The children pool member(s) either don\'t have service checking enabled, or service check results are not available yet', + mask: '255.255.255.0', + name: '/Example_Tenant/A1/serviceMain', + ipProtocol: 'tcp', + tenant: 'Example_Tenant', + pool: '/Example_Tenant/A1/barbar_pool', + application: 'A1' + } + }, { metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain.clientside-totConns', metricValue: 0, @@ -936,6 +1002,19 @@ module.exports = { application: 'A1' } }, + { + metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain-Redirect.clientside-evictedConns', + metricValue: 0, + metricTags: { + destination: '192.0.2.11:80', + availabilityState: 'unknown', + enabledState: 'enabled', + 'status.statusReason': 'The children pool member(s) either don\'t have service checking enabled, or service check results are not available yet', + name: '/Example_Tenant/A1/serviceMain-Redirect', + tenant: 'Example_Tenant', + application: 'A1' + } + }, { metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain-Redirect.clientside-maxConns', metricValue: 0, @@ -975,6 +1054,19 @@ module.exports = { application: 'A1' } }, + { + metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain-Redirect.clientside-slowKilled', + metricValue: 0, + metricTags: { + destination: '192.0.2.11:80', + availabilityState: 'unknown', + enabledState: 'enabled', + 'status.statusReason': 'The children pool member(s) either don\'t have service checking enabled, or service check results are not available yet', + name: '/Example_Tenant/A1/serviceMain-Redirect', + tenant: 'Example_Tenant', + application: 'A1' + } + }, { metricName: 'f5telemetry.telemetry-bigip-com.virtualServers.-Example_Tenant-A1-serviceMain-Redirect.clientside-totConns', metricValue: 0, @@ -1084,17 +1176,6 @@ module.exports = { application: 'app.app' } }, - { - metricName: 'f5telemetry.telemetry-bigip-com.pools.-Common-app-app-app_pool.members.-Common-10-0-3-5-80.port', - metricValue: 0, - metricTags: { - addr: '10.0.3.5', - monitorStatus: 'up', - availabilityState: 'available', - enabledState: 'enabled', - 'status.statusReason': 'Pool member is available' - } - }, { metricName: 'f5telemetry.telemetry-bigip-com.pools.-Common-app-app-app_pool.members.-Common-10-0-3-5-80.serverside-bitsIn', metricValue: 0, @@ -1103,6 +1184,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1114,6 +1196,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1125,6 +1208,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1136,6 +1220,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1147,6 +1232,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1158,6 +1244,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1169,6 +1256,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1260,17 +1348,6 @@ module.exports = { tenant: 'Common' } }, - { - metricName: 'f5telemetry.telemetry-bigip-com.pools.-Common-telemetry-local.members.-Common-10-0-1-100-6514.port', - metricValue: 0, - metricTags: { - addr: '10.0.1.100', - monitorStatus: 'down', - availabilityState: 'available', - enabledState: 'enabled', - 'status.statusReason': 'Pool member has been marked down by a monitor' - } - }, { metricName: 'f5telemetry.telemetry-bigip-com.pools.-Common-telemetry-local.members.-Common-10-0-1-100-6514.serverside-bitsIn', metricValue: 0, @@ -1279,6 +1356,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1290,6 +1368,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1301,6 +1380,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1312,6 +1392,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1323,6 +1404,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1334,6 +1416,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1345,6 +1428,7 @@ module.exports = { monitorStatus: 'down', availabilityState: 'available', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member has been marked down by a monitor' } }, @@ -1444,17 +1528,6 @@ module.exports = { application: 'A1' } }, - { - metricName: 'f5telemetry.telemetry-bigip-com.pools.-Example_Tenant-A1-hsl_pool.members.-Example_Tenant-192-168-120-6-514.port', - metricValue: 0, - metricTags: { - addr: '192.168.120.6', - monitorStatus: 'up', - availabilityState: 'offline', - enabledState: 'enabled', - 'status.statusReason': 'Pool member is available' - } - }, { metricName: 'f5telemetry.telemetry-bigip-com.pools.-Example_Tenant-A1-hsl_pool.members.-Example_Tenant-192-168-120-6-514.serverside-bitsIn', metricValue: 0, @@ -1463,6 +1536,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1474,6 +1548,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1485,6 +1560,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1496,6 +1572,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1507,6 +1584,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1518,6 +1596,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1529,6 +1608,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1628,17 +1708,6 @@ module.exports = { application: 'A1' } }, - { - metricName: 'f5telemetry.telemetry-bigip-com.pools.-Example_Tenant-A1-web_pool.members.-Example_Tenant-192-0-2-12-80.port', - metricValue: 0, - metricTags: { - addr: '192.0.2.12', - monitorStatus: 'up', - availabilityState: 'offline', - enabledState: 'enabled', - 'status.statusReason': 'Pool member is available' - } - }, { metricName: 'f5telemetry.telemetry-bigip-com.pools.-Example_Tenant-A1-web_pool.members.-Example_Tenant-192-0-2-12-80.serverside-bitsIn', metricValue: 0, @@ -1647,6 +1716,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1658,6 +1728,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1669,6 +1740,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1680,6 +1752,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1691,6 +1764,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1702,6 +1776,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1713,17 +1788,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', - 'status.statusReason': 'Pool member is available' - } - }, - { - metricName: 'f5telemetry.telemetry-bigip-com.pools.-Example_Tenant-A1-web_pool.members.-Example_Tenant-192-0-2-13-80.port', - metricValue: 0, - metricTags: { - addr: '192.0.2.13', - monitorStatus: 'up', - availabilityState: 'offline', - enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1735,6 +1800,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1746,6 +1812,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1757,6 +1824,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1768,6 +1836,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1779,6 +1848,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1790,6 +1860,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, @@ -1801,6 +1872,7 @@ module.exports = { monitorStatus: 'up', availabilityState: 'offline', enabledState: 'enabled', + port: 0, 'status.statusReason': 'Pool member is available' } }, diff --git a/test/unit/consumers/dataDogConsumerTests.js b/test/unit/consumers/dataDogConsumerTests.js new file mode 100644 index 00000000..0db75393 --- /dev/null +++ b/test/unit/consumers/dataDogConsumerTests.js @@ -0,0 +1,172 @@ +/* + * Copyright 2021. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ + +'use strict'; + +/* eslint-disable import/order */ + +require('../shared/restoreCache')(); + +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); +const nock = require('nock'); + +const dataDogIndex = require('../../../src/lib/consumers/DataDog/index'); +const testUtil = require('../shared/util'); + +chai.use(chaiAsPromised); +const assert = chai.assert; + +describe('DataDog', () => { + // Note: if a test has no explicit assertions then it relies on 'checkNockActiveMocks' in 'afterEach' + const DATA_DOG_API_KEY = 'test'; + const DATA_DOG_GATEWAYS = { + logs: { + host: 'https://http-intake.logs.datadoghq.com', + path: '/v1/input', + response: { + success: { + code: 200, + data: '{}' + } + } + }, + metrics: { + host: 'https://api.datadoghq.com', + path: '/api/v1/series', + response: { + success: { + code: 202, + data: '{"status":"ok"}' + } + } + } + }; + const DATA_DOG_NOCK_OPTS = { + reqheaders: { + 'Content-Type': 'application/json', + 'DD-API-KEY': DATA_DOG_API_KEY + } + }; + + const defaultConsumerConfig = { + apiKey: DATA_DOG_API_KEY + }; + + afterEach(() => { + testUtil.checkNockActiveMocks(nock); + nock.cleanAll(); + }); + + describe('process', () => { + it('should process systemInfo data', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: defaultConsumerConfig + }); + nock(DATA_DOG_GATEWAYS.metrics.host, DATA_DOG_NOCK_OPTS) + .post(DATA_DOG_GATEWAYS.metrics.path) + .reply( + DATA_DOG_GATEWAYS.metrics.response.success.code, + DATA_DOG_GATEWAYS.metrics.response.success.data + ); + return dataDogIndex(context); + }); + + it('should process event listener event with metrics (AVR)', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'AVR', + config: defaultConsumerConfig + }); + nock(DATA_DOG_GATEWAYS.metrics.host, DATA_DOG_NOCK_OPTS) + .post(DATA_DOG_GATEWAYS.metrics.path) + .reply( + DATA_DOG_GATEWAYS.metrics.response.success.code, + DATA_DOG_GATEWAYS.metrics.response.success.data + ); + return dataDogIndex(context); + }); + + it('should process event listener event without metrics (LTM)', () => { + const context = testUtil.buildConsumerContext({ + config: defaultConsumerConfig + }); + context.event.type = 'LTM'; + context.event.data = { + key: 'value', + telemetryEventCategory: 'LTM' + }; + nock(DATA_DOG_GATEWAYS.logs.host, DATA_DOG_NOCK_OPTS) + .post(DATA_DOG_GATEWAYS.logs.path) + .reply( + DATA_DOG_GATEWAYS.logs.response.success.code, + DATA_DOG_GATEWAYS.logs.response.success.data + ); + return dataDogIndex(context); + }); + + it('should process event listener event without metrics (syslog)', () => { + const context = testUtil.buildConsumerContext({ + config: defaultConsumerConfig + }); + context.event.type = 'syslog'; + context.event.data = { + data: '<134>Jul 6 22:37:49 bigip14.1.2.3.test info httpd(pam_audit)[13810]: 01070417:6: AUDIT - user admin - RAW: httpd(pam_audit): user=admin(admin) partition=[All] level=Administrator tty=(unknown) host=172.18.5.167 attempts=1 start="Mon Jul 6 22:37:49 2020" end="Mon Jul 6 22:37:49 2020"', + hostname: 'bigip14.1.2.3.test', + telemetryEventCategory: 'syslog' + }; + nock(DATA_DOG_GATEWAYS.logs.host, DATA_DOG_NOCK_OPTS) + .post(DATA_DOG_GATEWAYS.logs.path) + .reply( + DATA_DOG_GATEWAYS.logs.response.success.code, + DATA_DOG_GATEWAYS.logs.response.success.data + ); + return dataDogIndex(context); + }); + + it('should process event listener event without metrics (plain event)', () => { + const context = testUtil.buildConsumerContext({ + config: defaultConsumerConfig + }); + context.event.type = 'syslog'; + context.event.data = { + data: 'plain data', + telemetryEventCategory: 'event' + }; + nock(DATA_DOG_GATEWAYS.logs.host, DATA_DOG_NOCK_OPTS) + .post(DATA_DOG_GATEWAYS.logs.path) + .reply( + DATA_DOG_GATEWAYS.logs.response.success.code, + DATA_DOG_GATEWAYS.logs.response.success.data + ); + return dataDogIndex(context); + }); + + it('should trace data', () => { + const context = testUtil.buildConsumerContext({ + config: defaultConsumerConfig + }); + context.event.type = 'syslog'; + context.event.data = { + data: 'plain data', + telemetryEventCategory: 'event' + }; + nock(DATA_DOG_GATEWAYS.logs.host, DATA_DOG_NOCK_OPTS) + .post(DATA_DOG_GATEWAYS.logs.path) + .reply( + DATA_DOG_GATEWAYS.logs.response.success.code, + DATA_DOG_GATEWAYS.logs.response.success.data + ); + return dataDogIndex(context) + .then(() => { + const traceData = context.tracer.write.firstCall.args[0]; + assert.deepStrictEqual(traceData.data.ddsource, 'syslog'); + }); + }); + }); +}); diff --git a/test/unit/consumers/googleCloudLoggingTests.js b/test/unit/consumers/googleCloudLoggingTests.js new file mode 100644 index 00000000..9bacb9e7 --- /dev/null +++ b/test/unit/consumers/googleCloudLoggingTests.js @@ -0,0 +1,388 @@ +/* + * Copyright 2021. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ + +'use strict'; + +/* eslint-disable import/order */ + +require('../shared/restoreCache')(); + +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); +const nock = require('nock'); +const sinon = require('sinon'); +const jwt = require('jsonwebtoken'); + +const cloudLoggingIndex = require('../../../src/lib/consumers/Google_Cloud_Logging/index'); +const stubs = require('../shared/stubs'); +const testUtil = require('../shared/util'); + +chai.use(chaiAsPromised); +const assert = chai.assert; + +// Note: if a test has no explicit assertions then it relies on 'checkNockActiveMocks' in 'afterEach' +describe('Google_Cloud_Logging', () => { + const tokenDuration = 3600; + + let clock; + let persistentTime = 0; + + const incrementPersistentTime = () => { + persistentTime += tokenDuration * 1000; + clock.clockForward(tokenDuration * 1000, { repeat: 1 }); + }; + + const getDefaultConsumerConfig = () => testUtil.deepCopy({ + logScope: 'projects', + logScopeId: 'myProject', + logId: 'thisIsMyLog', + serviceEmail: 'serviceaccount@service.com', + privateKeyId: '12345', + privateKey: 'theprivatekeyvalue', + reportInstanceMetadata: false + }); + + const getExpectedData = (entries, opts) => { + opts = opts || {}; + return { + logName: opts.logName || 'projects/myProject/logs/thisIsMyLog', + resource: opts.resource || { + type: 'generic_node', + labels: { + node_id: 'telemetry.bigip.com', + location: 'global' + } + }, + entries + }; + }; + + beforeEach(() => { + clock = stubs.clock({ fakeTimersOpts: persistentTime }); + // Increment persistent time before each test, so any cached tokens are are expired + incrementPersistentTime(); + + // Returned signed JWT in format: privateKeyId::privateKey + sinon.stub(jwt, 'sign').callsFake((_, secret, options) => `${options.header.kid}::${secret}`); + }); + + afterEach(() => { + testUtil.checkNockActiveMocks(nock); + nock.cleanAll(); + sinon.restore(); + }); + + it('should process data (eventType = systemInfo)', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual( + req, getExpectedData([{ jsonPayload: testUtil.deepCopy(context.event.data) }]) + )); + + return cloudLoggingIndex(context); + }); + + it('should process data (eventType = AVR)', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'AVR', + config: getDefaultConsumerConfig() + }); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual( + req, getExpectedData([{ jsonPayload: testUtil.deepCopy(context.event.data) }]) + )); + + return cloudLoggingIndex(context); + }); + + it('should process data (dataType = string)', () => { + const context = testUtil.buildConsumerContext({ + config: getDefaultConsumerConfig() + }); + context.event.data = 'some random string we make get'; + + const expectedData = getExpectedData( + [{ textPayload: testUtil.deepCopy(context.event.data) }], + { + resource: { + type: 'generic_node', + labels: { + location: 'global' + } + } + } + ); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(context); + }); + + it('should log and trace data', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + const expectedData = getExpectedData( + [{ jsonPayload: testUtil.deepCopy(context.event.data) }] + ); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(context) + .then(() => { + const traceRecord = context.tracer.write.args[0]; + assert.strictEqual(context.logger.error.callCount, 0, 'should not log error'); + assert.deepStrictEqual(context.logger.debug.args, [['success']], 'should log success'); + assert.deepStrictEqual( + traceRecord, + [expectedData], + 'trace should include expected data' + ); + }); + }); + + it('should process data, when metadata reporting enabled', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + context.config.reportInstanceMetadata = true; + context.metadata = { + hostname: 'myHost', + id: 12345678, + zone: 'projects/87654321/zones/us-west1-a' + }; + + const expectedData = getExpectedData( + [{ jsonPayload: testUtil.deepCopy(context.event.data) }], + { + resource: { + type: 'gce_instance', + labels: { + instance_id: '12345678', + zone: 'us-west1-a' + } + } + } + ); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(context); + }); + + it('should process data, when metadata reporting disabled', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + context.metadata = { + hostname: 'myHost', + id: 12345678, + zone: 'projects/87654321/zones/us-west1-a' + }; + + const expectedData = getExpectedData( + [{ jsonPayload: testUtil.deepCopy(context.event.data) }] + ); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(context); + }); + + it('should process systemInfo data, with a cached access token', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + + const expectedData = getExpectedData( + [{ jsonPayload: testUtil.deepCopy(context.event.data) }] + ); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .times(2) + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('') + .times(3) + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(context) + .then(() => cloudLoggingIndex(context)) + .then(() => { + incrementPersistentTime(); + return cloudLoggingIndex(context); + }) + .then(() => { + assert.deepStrictEqual( + context.logger.debug.args, + Array(3).fill(['success']), + 'should have 3 successful messages' + ); + }); + }); + + it('should process systemInfo data, with multiple cached access tokens', () => { + // Context A + const contextA = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + Object.assign(contextA.config, { privateKeyId: 'privateKey1', privateKey: 'firstKey' }); + + // Context B + const contextB = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + Object.assign(contextB.config, { privateKeyId: 'privateKey2', privateKey: 'secondKey' }); + + const expectedData = getExpectedData( + [{ jsonPayload: testUtil.deepCopy(contextA.event.data) }] + ); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === 'privateKey1::firstKey') + .reply(200, { access_token: 'tokenA', expires_in: tokenDuration }); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === 'privateKey2::secondKey') + .reply(200, { access_token: 'tokenB', expires_in: tokenDuration }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer tokenA' + } + }) + .post('') + .times(2) + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: 'Bearer tokenB' + } + }) + .post('') + .times(2) + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(contextA) + .then(() => cloudLoggingIndex(contextB)) + .then(() => cloudLoggingIndex(contextA)) + .then(() => cloudLoggingIndex(contextB)); + }); + + it('should invalidate token if Unauthorized error on sending data', () => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: getDefaultConsumerConfig() + }); + + const expectedData = getExpectedData( + [{ jsonPayload: testUtil.deepCopy(context.event.data) }] + ); + let tokenCounter = 0; + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .times(2) + .reply(200, () => { + tokenCounter += 1; + return { access_token: `token:${tokenCounter}`, expires_in: tokenDuration }; + }); + + nock('https://logging.googleapis.com/v2/entries:write', { + reqheaders: { + authorization: a => a === `Bearer token:${tokenCounter}` + } + }) + .post('') + .reply(401, (_, req) => { + assert.deepStrictEqual(req, expectedData); + return 'Unauthorized'; + }) + .post('') + .reply(200, (_, req) => assert.deepStrictEqual(req, expectedData)); + + return cloudLoggingIndex(context) + .then(() => cloudLoggingIndex(context)); + }); +}); diff --git a/test/unit/consumers/googleCloudMonitoringConsumerTests.js b/test/unit/consumers/googleCloudMonitoringConsumerTests.js index 0a2b8bb0..8d8c8739 100644 --- a/test/unit/consumers/googleCloudMonitoringConsumerTests.js +++ b/test/unit/consumers/googleCloudMonitoringConsumerTests.js @@ -213,6 +213,93 @@ describe('Google_Cloud_Monitoring', () => { }); }); + it('should process systemInfo data, when metadata reporting enabled', () => { + const expectedTimeSeries = testUtil.deepCopy(getOriginTimeSeries()); + expectedTimeSeries.timeSeries.forEach((series) => { + series.resource = { + type: 'gce_instance', + labels: { + instance_id: '12345678', + zone: 'us-west1-a' + } + }; + }); + + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://monitoring.googleapis.com/v3/projects/theProject/metricDescriptors', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .get('') + .reply(200, metricDescriptors.onGet); + + nock('https://monitoring.googleapis.com/v3/projects/theProject/metricDescriptors', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('', metricDescriptors.onPost) + .reply(200, {}); + + nock('https://monitoring.googleapis.com/v3/projects/theProject/timeSeries', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('', expectedTimeSeries) + .reply(200, {}); + + context.config.reportInstanceMetadata = true; + context.metadata = { + hostname: 'myHost', + id: 12345678, + zone: 'projects/87654321/zones/us-west1-a' + }; + return cloudMonitoringIndex(context); + }); + + it('should process systemInfo data, when metadata reporting disabled', () => { + nock('https://oauth2.googleapis.com/token') + .post('', body => body.assertion === '12345::theprivatekeyvalue') + .reply(200, { access_token: 'aToken', expires_in: tokenDuration }); + + nock('https://monitoring.googleapis.com/v3/projects/theProject/metricDescriptors', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .get('') + .reply(200, metricDescriptors.onGet); + + nock('https://monitoring.googleapis.com/v3/projects/theProject/metricDescriptors', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('', metricDescriptors.onPost) + .reply(200, {}); + + nock('https://monitoring.googleapis.com/v3/projects/theProject/timeSeries', { + reqheaders: { + authorization: 'Bearer aToken' + } + }) + .post('', getOriginTimeSeries()) + .reply(200, {}); + + context.config.reportInstanceMetadata = false; + context.metadata = { + hostname: 'myHost', + id: 12345678, + zone: 'projects/87654321/zones/us-west1-a' + }; + return cloudMonitoringIndex(context); + }); + it('should process systemInfo data, with a cached access token', () => { nock('https://oauth2.googleapis.com/token') .post('', body => body.assertion === '12345::theprivatekeyvalue') diff --git a/test/unit/consumers/kafkaConsumerTests.js b/test/unit/consumers/kafkaConsumerTests.js index 6b0dd084..061c5324 100644 --- a/test/unit/consumers/kafkaConsumerTests.js +++ b/test/unit/consumers/kafkaConsumerTests.js @@ -25,8 +25,10 @@ const assert = chai.assert; describe('Kafka', () => { let sendStub; + let kafkaProducerStub; let passedClientOptions; + let portCount = 9090; const defaultConsumerConfig = { host: 'kafka-host1', port: '9092', @@ -34,6 +36,7 @@ describe('Kafka', () => { }; beforeEach(() => { + defaultConsumerConfig.port = portCount.toString(); sinon.stub(kafka, 'KafkaClient').callsFake((opts) => { passedClientOptions = opts; const events = {}; @@ -46,8 +49,13 @@ describe('Kafka', () => { } }; }); - sinon.stub(kafka, 'Producer').returns({ + kafkaProducerStub = sinon.stub(kafka, 'Producer').returns({ on: (event, cb) => { + // No errors, this is a happy place + if (event === 'error') { + return; + } + cb(); }, send: (payload, cb) => sendStub(payload, cb) @@ -55,6 +63,7 @@ describe('Kafka', () => { }); afterEach(() => { + portCount += 1; sinon.restore(); }); @@ -70,7 +79,7 @@ describe('Kafka', () => { }); const expectedOptions = { connectTimeout: 3000, - kafkaHost: 'kafka-host1:9092', + kafkaHost: `kafka-host1:${portCount}`, requestTimeout: 5000, sasl: null, sslOptions: null @@ -211,5 +220,95 @@ describe('Kafka', () => { kafkaIndex(context); }); + + it('should cache clients between calls', (done) => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: defaultConsumerConfig + }); + + let repeatCall = false; + let sendCount = 0; + sendStub = () => { + sendCount += 1; + if (!repeatCall) { + repeatCall = true; + return; + } + + try { + assert.strictEqual(kafka.KafkaClient.callCount, 1, 'should only create 1 Kafka Client'); + assert.strictEqual(sendCount, 2, 'should send data 2 times'); + done(); + } catch (err) { + // done() with parameter is treated as an error. + // Use catch back to pass thrown error from assert.deepStrictEqual to done() callback + done(err); + } + }; + + kafkaIndex(context); + kafkaIndex(context); + }); + + it('should not attempt to create multiple Kafka Clients during client initialization', (done) => { + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: defaultConsumerConfig + }); + + kafkaProducerStub.returns({ + on: (event, cb) => { + // This is not a happy place + if (event === 'error') { + return; + } + setTimeout(cb, 100); + }, + send: (payload, cb) => sendStub(payload, cb) + }); + + let sendCount = 0; + sendStub = () => { + sendCount += 1; + if (sendCount < 3) { + return; + } + + try { + assert.strictEqual(kafka.KafkaClient.callCount, 1, 'should only create 1 Kafka Client'); + assert.strictEqual(sendCount, 3, 'should send data 2 times'); + done(); + } catch (err) { + // done() with parameter is treated as an error. + // Use catch back to pass thrown error from assert.deepStrictEqual to done() callback + done(err); + } + }; + + kafkaIndex(context); + kafkaIndex(context); + kafkaIndex(context); + }); + + it('should not reject on error connecting to Kafka', () => { + kafkaProducerStub.returns({ + on: (event, cb) => { + // This is not a happy place + if (event === 'error') { + cb(new Error('connect ECONNREFUSED')); + } + } + }); + sendStub = sinon.stub(); + + const context = testUtil.buildConsumerContext({ + eventType: 'systemInfo', + config: defaultConsumerConfig + }); + + return kafkaIndex(context) + .then(() => assert.isFalse(sendStub.called, 'should not call producer.send()')); + }); }); }); diff --git a/test/unit/consumers/metricsUtilTests.js b/test/unit/consumers/metricsUtilTests.js new file mode 100644 index 00000000..23f0c620 --- /dev/null +++ b/test/unit/consumers/metricsUtilTests.js @@ -0,0 +1,697 @@ +/* + * Copyright 2021. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ + +'use strict'; + +/* eslint-disable import/order */ + +require('../shared/restoreCache')(); + +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); +const sinon = require('sinon'); + +const metricsUtil = require('../../../src/lib/consumers/shared/metricsUtil'); + +chai.use(chaiAsPromised); +const assert = chai.assert; + +describe('Metrics Util Tests', () => { + afterEach(() => { + sinon.restore(); + }); + + describe('.findMetricsAndTags()', () => { + let collectedMetrics; + let collectedTags; + let defaultOptions; + + beforeEach(() => { + collectedMetrics = []; + collectedTags = []; + defaultOptions = { + collectTags: true, + parseMetrics: true, + onMetric: (mpath, mvalue, mtags) => collectedMetrics.push([mpath.join('.'), mvalue, mtags]), + onTags: (tpath, tagsValues) => collectedTags.push([tpath.join('.'), tagsValues]) + }; + }); + + it('should not modify original object when parsing disabled', () => { + const origin = { + metricString: '10.0', + nested: { + metricString: '12.0', + dataArray: [ + '13.0', + 'string' + ] + } + }; + metricsUtil.findMetricsAndTags(origin); + assert.deepStrictEqual(origin, { + metricString: '10.0', + nested: { + metricString: '12.0', + dataArray: [ + '13.0', + 'string' + ] + } + }, 'should not modify input data'); + }); + + it('should not modify original object when parsing disabled and tags collection enabled', () => { + const origin = { + metricString: '10.0', + tagData: 'tag', + nested: { + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + } + }; + metricsUtil.findMetricsAndTags(origin, { + collectTags: true, + onTags: () => {} + }); + assert.deepStrictEqual(origin, { + metricString: '10.0', + tagData: 'tag', + nested: { + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + } + }, 'should not modify input data'); + }); + + it('should parse and re-assign metrics when parsing enabled', () => { + const origin = { + metricString: '10.0', + tagData: 'tag', + nested: { + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + } + }; + metricsUtil.findMetricsAndTags(origin, { + parseMetrics: true + }); + assert.deepStrictEqual(origin, { + metricString: 10, + tagData: 'tag', + nested: { + metricString: 12, + tagData: 'tag2', + dataArray: [ + 13, + 'string' + ] + } + }, 'should parse metrics and update input data'); + }); + + it('should convert "name", "port" props to tags', () => { + const origin = { + system: { + networkInterfaces: { + '1.0': { + name: '1.0', + tag: 'tag', + bitsIn: '20' + } + } + }, + vs: { + vs1: { + name: 'vs1', + port: '3000', + bitsIn: '10' + } + } + }; + metricsUtil.findMetricsAndTags(origin, defaultOptions); + + assert.deepStrictEqual(origin, { + system: { + networkInterfaces: { + '1.0': { + name: '1.0', + tag: 'tag', + bitsIn: 20 + } + } + }, + vs: { + vs1: { + name: 'vs1', + port: '3000', + bitsIn: 10 + } + } + }, 'should parse metrics and update original data'); + + assert.sameDeepMembers(collectedTags, [ + ['system.networkInterfaces.1.0', { name: '1.0', tag: 'tag' }], + ['vs.vs1', { name: 'vs1', port: '3000' }] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['system.networkInterfaces.1.0.bitsIn', 20, { name: '1.0', tag: 'tag' }], + ['vs.vs1.bitsIn', 10, { name: 'vs1', port: '3000' }] + ], 'should collect all expected metrics'); + }); + + it('should not treat "Capacity" prop as a tag by default', () => { + const origin = { + system: { + diskStorage: { + '/var': { + name: '/var', + Capacity: '90%', + size: '1000' + } + } + } + }; + metricsUtil.findMetricsAndTags(origin, defaultOptions); + + assert.deepStrictEqual(origin, { + system: { + diskStorage: { + '/var': { + name: '/var', + Capacity: '90%', + size: 1000 + } + } + } + }, 'should parse metrics and update original data'); + + assert.sameDeepMembers(collectedTags, [ + ['system.diskStorage./var', { name: '/var' }] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['system.diskStorage./var.size', 1000, { name: '/var' }] + ], 'should collect all expected metrics'); + }); + + it('should collect all tags and metrics', () => { + const origin = { + metricString: '10.0', + tagData: 'tag', + nested: { + name: '14.0', // should ignore it by default + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + }, + virtuals: { + vs1: { + name: 'vs1', + ip: 'ip1', + bitsIn: '1000' + }, + vs2: { + name: 'vs2', + ip: 'ip2', + bitsIn: '2000' + } + }, + networkInterfaces: { + '1.0': { + name: '1.0', + bitsOut: '1000', + type: 'coper' + }, + '2.0': { + name: '2.0', + bitsOut: '2000', + type: 'optical' + } + }, + distStorage: { + '/var': { + name: '/var', + size: '1000', + Capacity: '10%' + }, + '/home': { + name: '/home', + size: '2000', + Capacity: '20%' + } + } + }; + metricsUtil.findMetricsAndTags(origin, defaultOptions); + assert.sameDeepMembers(collectedTags, [ + ['', { tagData: 'tag' }], + ['distStorage./var', { name: '/var' }], + ['distStorage./home', { name: '/home' }], + ['nested', { name: '14.0', tagData: 'tag2' }], + // eslint-disable-next-line quote-props + ['nested.dataArray', { '1': 'string' }], + ['networkInterfaces.1.0', { name: '1.0', type: 'coper' }], + ['networkInterfaces.2.0', { name: '2.0', type: 'optical' }], + ['virtuals.vs1', { name: 'vs1', ip: 'ip1' }], + ['virtuals.vs2', { name: 'vs2', ip: 'ip2' }] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['distStorage./var.size', 1000, { name: '/var' }], + ['distStorage./home.size', 2000, { name: '/home' }], + ['metricString', 10, { tagData: 'tag' }], + ['nested.metricString', 12, { name: '14.0', tagData: 'tag2' }], + // eslint-disable-next-line quote-props + ['nested.dataArray.0', 13, { '1': 'string' }], + ['networkInterfaces.1.0.bitsOut', 1000, { name: '1.0', type: 'coper' }], + ['networkInterfaces.2.0.bitsOut', 2000, { name: '2.0', type: 'optical' }], + ['virtuals.vs1.bitsIn', 1000, { name: 'vs1', ip: 'ip1' }], + ['virtuals.vs2.bitsIn', 2000, { name: 'vs2', ip: 'ip2' }] + ], 'should collect all expected metrics'); + }); + + it('should collect all tags and metrics and exclude name from path', () => { + const origin = { + metricString: '10.0', + tagData: 'tag', + nested: { + name: '14.0', // should ignore it by default + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + }, + virtuals: { + vs1: { + name: 'vs1', + ip: 'ip1', + bitsIn: '1000' + }, + vs2: { + name: 'vs2', + ip: 'ip2', + bitsIn: '2000' + } + }, + pools: { + pool1: { + name: 'pool1', + bitsIn: '5000', + members: { + member1: { + name: 'member1', + bitsIn: '6000' + } + } + } + }, + networkInterfaces: { + '1.0': { + name: '1.0', + bitsOut: '1000', + type: 'coper' + }, + '2.0': { + name: '2.0', + bitsOut: '2000', + type: 'optical' + } + }, + distStorage: { + '/var': { + name: '/var', + size: '1000', + Capacity: '10%' + }, + '/home': { + name: '/home', + size: '2000', + Capacity: '20%' + } + } + }; + metricsUtil.findMetricsAndTags( + origin, + Object.assign({ excludeNameFromPath: true }, defaultOptions) + ); + assert.sameDeepMembers(collectedTags, [ + ['', { tagData: 'tag' }], + ['distStorage', { name: '/var' }], + ['distStorage', { name: '/home' }], + ['nested', { name: '14.0', tagData: 'tag2' }], + // eslint-disable-next-line quote-props + ['nested.dataArray', { '1': 'string' }], + ['networkInterfaces', { name: '1.0', type: 'coper' }], + ['networkInterfaces', { name: '2.0', type: 'optical' }], + ['pools', { name: 'pool1' }], + ['pools.members', { name: 'member1' }], + ['virtuals', { name: 'vs1', ip: 'ip1' }], + ['virtuals', { name: 'vs2', ip: 'ip2' }] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['distStorage.size', 1000, { name: '/var' }], + ['distStorage.size', 2000, { name: '/home' }], + ['metricString', 10, { tagData: 'tag' }], + ['nested.metricString', 12, { name: '14.0', tagData: 'tag2' }], + // eslint-disable-next-line quote-props + ['nested.dataArray.0', 13, { '1': 'string' }], + ['networkInterfaces.bitsOut', 1000, { name: '1.0', type: 'coper' }], + ['networkInterfaces.bitsOut', 2000, { name: '2.0', type: 'optical' }], + ['pools.bitsIn', 5000, { name: 'pool1' }], + ['pools.members.bitsIn', 6000, { name: 'member1' }], + ['virtuals.bitsIn', 1000, { name: 'vs1', ip: 'ip1' }], + ['virtuals.bitsIn', 2000, { name: 'vs2', ip: 'ip2' }] + ], 'should collect all expected metrics'); + }); + + it('should collect all tags and metrics at max depth === 1', () => { + const origin = { + metricString: '10.0', + tagData: 'tag', + nested: { + name: '14.0', // should ignore it by default + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + }, + virtuals: { + vs1: { + name: 'vs1', + ip: 'ip1', + bitsIn: '1000' + }, + vs2: { + name: 'vs2', + ip: 'ip2', + bitsIn: '2000' + } + }, + networkInterfaces: { + '1.0': { + name: '1.0', + bitsOut: '1000', + type: 'coper' + }, + '2.0': { + name: '2.0', + bitsOut: '2000', + type: 'optical' + } + }, + distStorage: { + '/var': { + name: '/var', + size: '1000', + Capacity: '10%' + }, + '/home': { + name: '/home', + size: '2000', + Capacity: '20%' + } + } + }; + metricsUtil.findMetricsAndTags( + origin, + Object.assign({ maxDepth: 1 }, defaultOptions) + ); + assert.sameDeepMembers(collectedTags, [ + ['', { tagData: 'tag' }] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['metricString', 10, { tagData: 'tag' }] + ], 'should collect all expected metrics'); + }); + + it('should collect all tags and metrics and ignore non-default metrics and tags', () => { + const origin = { + metricString: '10.0', + tagData: 'tag', + nested: { + name: '14.0', // should ignore it by default + metricString: '12.0', + tagData: 'tag2', + dataArray: [ + '13.0', + 'string' + ] + }, + virtuals: { + vs1: { + name: 'vs1', + ip: 'ip1', + bitsIn: '1000', + port: 3000, + metricToTag: 20 + }, + vs2: { + name: 'vs2', + ip: 'ip2', + bitsIn: '2000', + port: 4000 + } + }, + networkInterfaces: { + '1.0': { + name: '1.0', + bandwidth: '2000', + bitsOut: '1000', + type: 'coper' + }, + '2.0': { + name: '2.0', + bandwidth: '3000', + bitsOut: '2000', + type: 'optical', + tagToMetric: 'still not a metric :-(' + } + }, + distStorage: { + '/var': { + name: '/var', + size: '1000', + Capacity: '10%', + tagToMetric: 'disk has 40.50mb left' + }, + '/home': { + name: '/home', + size: '2000', + Capacity: '20%', + tagToMetric: '20ms' + } + } + }; + metricsUtil.findMetricsAndTags( + origin, + Object.assign({ + metricsToIgnore: ['bitsIn', 'bitsOut'], + metricsToTags: ['metricToTag', 'name', 'port'], + tagsToIgnore: ['Capacity', 'ip', 'tagData', 'type'], + tagsToMetrics: ['tagToMetric'] + }, defaultOptions) + ); + assert.sameDeepMembers(collectedTags, [ + ['distStorage./home', { name: '/home' }], + ['distStorage./var', { name: '/var' }], + ['nested', { name: '14.0' }], + // eslint-disable-next-line quote-props + ['nested.dataArray', { '1': 'string' }], + ['networkInterfaces.1.0', { name: '1.0' }], + ['networkInterfaces.2.0', { name: '2.0' }], + ['virtuals.vs1', { name: 'vs1', port: 3000, metricToTag: 20 }], + ['virtuals.vs2', { name: 'vs2', port: 4000 }] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['distStorage./home.size', 2000, { name: '/home' }], + ['distStorage./home.tagToMetric', 20, { name: '/home' }], + ['distStorage./var.size', 1000, { name: '/var' }], + ['distStorage./var.tagToMetric', 40.50, { name: '/var' }], + ['metricString', 10, {}], + ['nested.metricString', 12, { name: '14.0' }], + // eslint-disable-next-line quote-props + ['nested.dataArray.0', 13, { '1': 'string' }], + ['networkInterfaces.1.0.bandwidth', 2000, { name: '1.0' }], + ['networkInterfaces.2.0.bandwidth', 3000, { name: '2.0' }] + ], 'should collect all expected metrics'); + }); + + it('should not allow ISO Dates in tags', () => { + const origin = { + sslCerts: { + 'ca-bundle.crt': { + expirationDate: 0, + expirationString: '2019-01-01T01:01:01Z', + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + } + }; + metricsUtil.findMetricsAndTags(origin, defaultOptions); + + assert.deepStrictEqual(origin, { + sslCerts: { + 'ca-bundle.crt': { + expirationDate: 0, + expirationString: '2019-01-01T01:01:01Z', + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + } + }, 'should parse metrics and update original data'); + + assert.sameDeepMembers(collectedTags, [ + [ + 'sslCerts.ca-bundle.crt', + { + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + ] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + [ + 'sslCerts.ca-bundle.crt.expirationDate', + 0, + { + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + ] + ], 'should collect all expected metrics'); + }); + + it('should allow ISO Dates in tags', () => { + const origin = { + sslCerts: { + 'ca-bundle.crt': { + expirationDate: 0, + expirationString: '2019-01-01T01:01:01Z', + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + } + }; + metricsUtil.findMetricsAndTags(origin, Object.assign({ allowIsoDateTag: true }, defaultOptions)); + + assert.deepStrictEqual(origin, { + sslCerts: { + 'ca-bundle.crt': { + expirationDate: 0, + expirationString: '2019-01-01T01:01:01Z', + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + } + }, 'should parse metrics and update original data'); + + assert.sameDeepMembers(collectedTags, [ + [ + 'sslCerts.ca-bundle.crt', + { + expirationString: '2019-01-01T01:01:01Z', + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + ] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + [ + 'sslCerts.ca-bundle.crt.expirationDate', + 0, + { + expirationString: '2019-01-01T01:01:01Z', + issuer: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + subject: 'CN=Starfield Services Root Certificate Authority,OU=http://certificates.starfieldtech.com/repository/,O=Starfield Technologies, Inc.,L=Scottsdale,ST=Arizona,C=US', + name: 'ca-bundle.crt' + } + ] + ], 'should collect all expected metrics'); + }); + + it('should ignore invalid numbers', () => { + const origin = { + invalidMetric: `${Number.MAX_VALUE}1`, + invalidMetricToTagString: `${Number.MAX_VALUE}1`, + invalidTagString: `invalid number - ${Number.MAX_VALUE}1`, + invalidTagToMetricString: `invalid number - ${Number.MAX_VALUE}1`, + validMetric: `${Number.MAX_VALUE}`, + validMetricToTagString: `${Number.MAX_VALUE}`, + validTagString: `invalid number - ${Number.MAX_VALUE}`, + validTagToMetricString: `invalid number - ${Number.MAX_VALUE}` + }; + metricsUtil.findMetricsAndTags( + origin, + Object.assign({ + metricsToTags: ['invalidMetricToTagString', 'validMetricToTagString'], + tagsToMetrics: ['invalidTagToMetricString', 'validTagToMetricString'] + }, defaultOptions) + ); + const expectedTags = { + invalidMetric: `${Number.MAX_VALUE}1`, + invalidMetricToTagString: `${Number.MAX_VALUE}1`, + invalidTagString: `invalid number - ${Number.MAX_VALUE}1`, + validMetricToTagString: `${Number.MAX_VALUE}`, + validTagString: `invalid number - ${Number.MAX_VALUE}` + }; + assert.sameDeepMembers(collectedTags, [ + ['', expectedTags] + ], 'should collect all expected tags'); + + assert.sameDeepMembers(collectedMetrics, [ + ['validMetric', Number.MAX_VALUE, expectedTags], + ['validTagToMetricString', Number.MAX_VALUE, expectedTags] + ], 'should collect all expected metrics'); + }); + + it('should not allow empty strings as tags', () => { + const origin = { + metric: 10, + application: '' + }; + metricsUtil.findMetricsAndTags(origin, defaultOptions); + + assert.sameDeepMembers(collectedTags, [], 'should collect all expected tags'); + assert.sameDeepMembers(collectedMetrics, [ + ['metric', 10, {}] + ], 'should collect all expected metrics'); + }); + }); +}); diff --git a/test/unit/data/configTestsData.js b/test/unit/data/configTestsData.js index 278ffede..e891e2d1 100644 --- a/test/unit/data/configTestsData.js +++ b/test/unit/data/configTestsData.js @@ -246,8 +246,8 @@ module.exports = { }, { name: 'My_Consumer', - traceName: 'My_Consumer', - id: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', + id: 'f5telemetry_default::My_Consumer', class: 'Telemetry_Consumer', type: 'Generic_HTTP', enable: true, @@ -260,7 +260,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false, @@ -317,8 +317,8 @@ module.exports = { }, { name: 'My_Consumer', - traceName: 'My_Consumer', - id: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', + id: 'f5telemetry_default::My_Consumer', class: 'Telemetry_Consumer', type: 'Generic_HTTP', enable: true, @@ -331,7 +331,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false, @@ -770,8 +770,8 @@ module.exports = { }, { name: 'My_Consumer', - traceName: 'My_Consumer', - id: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', + id: 'f5telemetry_default::My_Consumer', class: 'Telemetry_Consumer', type: 'Generic_HTTP', enable: true, @@ -784,7 +784,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false, @@ -842,8 +842,8 @@ module.exports = { }, { name: 'My_Consumer', - traceName: 'My_Consumer', - id: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', + id: 'f5telemetry_default::My_Consumer', class: 'Telemetry_Consumer', type: 'Generic_HTTP', enable: true, @@ -856,7 +856,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, allowSelfSignedCert: false, diff --git a/test/unit/data/configUtilTests/getComponentsTestsData.js b/test/unit/data/configUtilTests/getComponentsTestsData.js index 3e0be9e5..1b725335 100644 --- a/test/unit/data/configUtilTests/getComponentsTestsData.js +++ b/test/unit/data/configUtilTests/getComponentsTestsData.js @@ -39,15 +39,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -104,15 +104,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -121,15 +121,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_2', + id: 'f5telemetry_default::Consumer_2', name: 'Consumer_2', - traceName: 'Consumer_2', + traceName: 'f5telemetry_default::Consumer_2', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_2', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_2', type: 'output' }, type: 'default' @@ -203,15 +203,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -276,7 +276,7 @@ module.exports = { } ], enable: true, - id: 'Listener1', + id: 'f5telemetry_default::Listener1', match: '', name: 'Listener1', namespace: 'f5telemetry_default', @@ -286,31 +286,31 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.Listener1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::Listener1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.Listener1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::Listener1', type: 'output' }, - traceName: 'Listener1' + traceName: 'f5telemetry_default::Listener1' }, { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -319,15 +319,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_2', + id: 'f5telemetry_default::Consumer_2', name: 'Consumer_2', - traceName: 'Consumer_2', + traceName: 'f5telemetry_default::Consumer_2', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_2', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_2', type: 'output' }, type: 'default' @@ -433,15 +433,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -450,15 +450,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_2', + id: 'f5telemetry_default::Consumer_2', name: 'Consumer_2', - traceName: 'Consumer_2', + traceName: 'f5telemetry_default::Consumer_2', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_2', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_2', type: 'output' }, type: 'default' @@ -498,15 +498,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' diff --git a/test/unit/data/configUtilTests/mergeDeclarationTestsData.js b/test/unit/data/configUtilTests/mergeDeclarationTestsData.js index 5207c957..65e3fe6a 100644 --- a/test/unit/data/configUtilTests/mergeDeclarationTestsData.js +++ b/test/unit/data/configUtilTests/mergeDeclarationTestsData.js @@ -58,8 +58,8 @@ module.exports = { }, expected: { mappings: { - My_Listener_1: [ - 'My_Consumer_1' + 'f5telemetry_default::My_Listener_1': [ + 'f5telemetry_default::My_Consumer_1' ], 'My_Namespace::My_Listener_1': [ 'My_Namespace::My_Consumer_1' @@ -74,14 +74,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, allowSelfSignedCert: false, name: 'My_Consumer_1', namespace: 'f5telemetry_default', - traceName: 'My_Consumer_1', - id: 'My_Consumer_1' + traceName: 'f5telemetry_default::My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1' }, { class: 'Telemetry_Listener', @@ -90,14 +90,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, port: 6514, @@ -114,8 +114,8 @@ module.exports = { name: 'My_Listener_1', namespace: 'f5telemetry_default', tag: {}, - traceName: 'My_Listener_1', - id: 'My_Listener_1' + traceName: 'f5telemetry_default::My_Listener_1', + id: 'f5telemetry_default::My_Listener_1' }, { class: 'Telemetry_Consumer', @@ -198,8 +198,8 @@ module.exports = { }, expected: { mappings: { - My_Listener_1: [ - 'My_Consumer_1' + 'f5telemetry_default::My_Listener_1': [ + 'f5telemetry_default::My_Consumer_1' ], 'My_Namespace::My_Listener_1': [ 'My_Namespace::My_Consumer_1' @@ -214,14 +214,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, allowSelfSignedCert: false, name: 'My_Consumer_1', namespace: 'f5telemetry_default', - traceName: 'My_Consumer_1', - id: 'My_Consumer_1' + traceName: 'f5telemetry_default::My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1' }, { class: 'Telemetry_Listener', @@ -230,14 +230,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, port: 6514, @@ -254,8 +254,8 @@ module.exports = { name: 'My_Listener_1', namespace: 'f5telemetry_default', tag: {}, - traceName: 'My_Listener_1', - id: 'My_Listener_1' + traceName: 'f5telemetry_default::My_Listener_1', + id: 'f5telemetry_default::My_Listener_1' }, { class: 'Telemetry_Consumer', @@ -348,8 +348,8 @@ module.exports = { }, expected: { mappings: { - My_Listener_1: [ - 'My_Consumer_1' + 'f5telemetry_default::My_Listener_1': [ + 'f5telemetry_default::My_Consumer_1' ], 'My_Namespace::My_Listener_1': [ 'My_Namespace::My_Consumer_1' @@ -367,14 +367,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, allowSelfSignedCert: false, name: 'My_Consumer_1', namespace: 'f5telemetry_default', - traceName: 'My_Consumer_1', - id: 'My_Consumer_1' + traceName: 'f5telemetry_default::My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1' }, { class: 'Telemetry_Listener', @@ -383,14 +383,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, port: 6514, @@ -407,8 +407,8 @@ module.exports = { name: 'My_Listener_1', namespace: 'f5telemetry_default', tag: {}, - traceName: 'My_Listener_1', - id: 'My_Listener_1' + traceName: 'f5telemetry_default::My_Listener_1', + id: 'f5telemetry_default::My_Listener_1' }, { class: 'Telemetry_Consumer', @@ -569,8 +569,8 @@ module.exports = { }, expected: { mappings: { - My_Listener_1_Overwritten: [ - 'My_Consumer_1_Overwritten' + 'f5telemetry_default::My_Listener_1_Overwritten': [ + 'f5telemetry_default::My_Consumer_1_Overwritten' ], 'My_Namespace::My_Listener_1_Overwritten': [ 'My_Namespace::My_Consumer_1_Overwritten' @@ -588,14 +588,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1_Overwritten', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1_Overwritten', type: 'output' }, allowSelfSignedCert: false, name: 'My_Consumer_1_Overwritten', namespace: 'f5telemetry_default', - traceName: 'My_Consumer_1_Overwritten', - id: 'My_Consumer_1_Overwritten' + traceName: 'f5telemetry_default::My_Consumer_1_Overwritten', + id: 'f5telemetry_default::My_Consumer_1_Overwritten' }, { class: 'Telemetry_Listener', @@ -604,14 +604,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1_Overwritten', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1_Overwritten', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1_Overwritten', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1_Overwritten', type: 'output' }, port: 6514, @@ -628,8 +628,8 @@ module.exports = { name: 'My_Listener_1_Overwritten', namespace: 'f5telemetry_default', tag: {}, - traceName: 'My_Listener_1_Overwritten', - id: 'My_Listener_1_Overwritten' + traceName: 'f5telemetry_default::My_Listener_1_Overwritten', + id: 'f5telemetry_default::My_Listener_1_Overwritten' }, { class: 'Telemetry_Consumer', diff --git a/test/unit/data/configUtilTests/normalizeDeclarationEndpointsTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationEndpointsTestsData.js index ecf3fc7e..72f0203a 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationEndpointsTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationEndpointsTestsData.js @@ -63,16 +63,16 @@ module.exports = { enable: true, interval: 300, class: 'Telemetry_System_Poller', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', name: 'SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, connection: { @@ -187,16 +187,16 @@ module.exports = { enable: true, interval: 300, class: 'Telemetry_System_Poller', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', name: 'SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, connection: { @@ -507,16 +507,16 @@ module.exports = { enable: true, interval: 300, class: 'Telemetry_System_Poller', - id: 'My_System_1::SystemPoller_1', + id: 'f5telemetry_default::My_System_1::SystemPoller_1', name: 'SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System_1', - traceName: 'My_System_1::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_1::SystemPoller_1', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_1::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_1::SystemPoller_1', type: 'output' }, connection: { @@ -554,16 +554,16 @@ module.exports = { enable: true, interval: 300, class: 'Telemetry_System_Poller', - id: 'My_System_2::SystemPoller_1', + id: 'f5telemetry_default::My_System_2::SystemPoller_1', name: 'SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System_2', - traceName: 'My_System_2::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_2::SystemPoller_1', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_2::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_2::SystemPoller_1', type: 'output' }, connection: { @@ -616,16 +616,16 @@ module.exports = { enable: true, interval: 300, class: 'Telemetry_System_Poller', - id: 'My_System_3::SystemPoller_1', + id: 'f5telemetry_default::My_System_3::SystemPoller_1', name: 'SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System_3', - traceName: 'My_System_3::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_3::SystemPoller_1', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_3::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_3::SystemPoller_1', type: 'output' }, connection: { diff --git a/test/unit/data/configUtilTests/normalizeDeclarationEventListenerTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationEventListenerTestsData.js index bcba391a..fb5bf52d 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationEventListenerTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationEventListenerTestsData.js @@ -86,10 +86,10 @@ module.exports = { mappings: {}, components: [ { - id: 'My_Listener_1', + id: 'f5telemetry_default::My_Listener_1', name: 'My_Listener_1', namespace: 'f5telemetry_default', - traceName: 'My_Listener_1', + traceName: 'f5telemetry_default::My_Listener_1', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -97,14 +97,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, match: '', @@ -120,10 +120,10 @@ module.exports = { ] }, { - id: 'My_Listener_2', + id: 'f5telemetry_default::My_Listener_2', name: 'My_Listener_2', namespace: 'f5telemetry_default', - traceName: 'My_Listener_2', + traceName: 'f5telemetry_default::My_Listener_2', class: 'Telemetry_Listener', port: 4567, enable: false, @@ -260,10 +260,10 @@ module.exports = { mappings: {}, components: [ { - id: 'My_Listener_1', + id: 'f5telemetry_default::My_Listener_1', name: 'My_Listener_1', namespace: 'f5telemetry_default', - traceName: 'My_Listener_1', + traceName: 'f5telemetry_default::My_Listener_1', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -271,14 +271,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, match: '', @@ -294,10 +294,10 @@ module.exports = { ] }, { - id: 'My_Listener_2', + id: 'f5telemetry_default::My_Listener_2', name: 'My_Listener_2', namespace: 'f5telemetry_default', - traceName: 'My_Listener_2', + traceName: 'f5telemetry_default::My_Listener_2', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -305,14 +305,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_2', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_2', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_2', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_2', type: 'output' }, match: '', @@ -441,8 +441,8 @@ module.exports = { }, expected: { mappings: { - My_Listener_1: ['Consumer_1'], - My_Listener_2: ['Consumer_1'], + 'f5telemetry_default::My_Listener_1': ['f5telemetry_default::Consumer_1'], + 'f5telemetry_default::My_Listener_2': ['f5telemetry_default::Consumer_1'], 'My_Namespace::My_Listener_1': ['My_Namespace::Consumer_1'], 'My_Namespace::My_Listener_2': ['My_Namespace::Consumer_1'], 'My_Namespace_2::My_Listener_1': ['My_Namespace_2::Consumer_1'], @@ -450,10 +450,10 @@ module.exports = { }, components: [ { - id: 'My_Listener_1', + id: 'f5telemetry_default::My_Listener_1', name: 'My_Listener_1', namespace: 'f5telemetry_default', - traceName: 'My_Listener_1', + traceName: 'f5telemetry_default::My_Listener_1', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -461,14 +461,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, match: '', @@ -484,10 +484,10 @@ module.exports = { ] }, { - id: 'My_Listener_2', + id: 'f5telemetry_default::My_Listener_2', name: 'My_Listener_2', namespace: 'f5telemetry_default', - traceName: 'My_Listener_2', + traceName: 'f5telemetry_default::My_Listener_2', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -495,14 +495,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_2', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_2', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_2', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_2', type: 'output' }, match: '', @@ -521,15 +521,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -762,8 +762,8 @@ module.exports = { }, expected: { mappings: { - My_Listener_1: ['Consumer_1', 'Consumer_2'], - My_Listener_2: ['Consumer_1', 'Consumer_2'], + 'f5telemetry_default::My_Listener_1': ['f5telemetry_default::Consumer_1', 'f5telemetry_default::Consumer_2'], + 'f5telemetry_default::My_Listener_2': ['f5telemetry_default::Consumer_1', 'f5telemetry_default::Consumer_2'], 'My_Namespace::My_Listener_1': ['My_Namespace::Consumer_1', 'My_Namespace::Consumer_2'], 'My_Namespace::My_Listener_2': ['My_Namespace::Consumer_1', 'My_Namespace::Consumer_2'], 'My_Namespace_2::My_Listener_1': ['My_Namespace_2::Consumer_1', 'My_Namespace_2::Consumer_2'], @@ -771,10 +771,10 @@ module.exports = { }, components: [ { - id: 'My_Listener_1', + id: 'f5telemetry_default::My_Listener_1', name: 'My_Listener_1', namespace: 'f5telemetry_default', - traceName: 'My_Listener_1', + traceName: 'f5telemetry_default::My_Listener_1', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -782,14 +782,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_1', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_1', type: 'output' }, match: '', @@ -805,10 +805,10 @@ module.exports = { ] }, { - id: 'My_Listener_2', + id: 'f5telemetry_default::My_Listener_2', name: 'My_Listener_2', namespace: 'f5telemetry_default', - traceName: 'My_Listener_2', + traceName: 'f5telemetry_default::My_Listener_2', class: 'Telemetry_Listener', port: 6514, enable: true, @@ -816,14 +816,14 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 9999, - path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.My_Listener_2', + path: '/var/tmp/telemetry/INPUT.Telemetry_Listener.f5telemetry_default::My_Listener_2', type: 'input' }, trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Listener.My_Listener_2', + path: '/var/tmp/telemetry/Telemetry_Listener.f5telemetry_default::My_Listener_2', type: 'output' }, match: '', @@ -842,15 +842,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_1', + id: 'f5telemetry_default::Consumer_1', name: 'Consumer_1', - traceName: 'Consumer_1', + traceName: 'f5telemetry_default::Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_1', type: 'output' }, type: 'default' @@ -859,15 +859,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'Consumer_2', + id: 'f5telemetry_default::Consumer_2', name: 'Consumer_2', - traceName: 'Consumer_2', + traceName: 'f5telemetry_default::Consumer_2', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.Consumer_2', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::Consumer_2', type: 'output' }, type: 'default' diff --git a/test/unit/data/configUtilTests/normalizeDeclarationIHealthPollerTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationIHealthPollerTestsData.js index d76e5f35..d6b566b2 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationIHealthPollerTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationIHealthPollerTestsData.js @@ -78,8 +78,8 @@ module.exports = { mappings: { 'My_Namespace::My_System::SystemPoller_1': ['My_Namespace::My_Consumer'], 'My_Namespace::My_System::iHealthPoller_1': ['My_Namespace::My_Consumer'], - 'My_System::SystemPoller_1': ['My_Consumer'], - 'My_System::iHealthPoller_1': ['My_Consumer'] + 'f5telemetry_default::My_System::SystemPoller_1': ['f5telemetry_default::My_Consumer'], + 'f5telemetry_default::My_System::iHealthPoller_1': ['f5telemetry_default::My_Consumer'] }, components: [ { @@ -108,7 +108,7 @@ module.exports = { tags: undefined }, enable: true, - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', interval: 60, name: 'SystemPoller_1', namespace: 'f5telemetry_default', @@ -117,10 +117,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, - traceName: 'My_System::SystemPoller_1' + traceName: 'f5telemetry_default::My_System::SystemPoller_1' }, { class: 'Telemetry_iHealth_Poller', @@ -130,7 +130,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System::iHealthPoller_1', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System::iHealthPoller_1', type: 'output' }, iHealth: { @@ -178,26 +178,26 @@ module.exports = { passphrase: undefined } }, - id: 'My_System::iHealthPoller_1', + id: 'f5telemetry_default::My_System::iHealthPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::iHealthPoller_1' + traceName: 'f5telemetry_default::My_System::iHealthPoller_1' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer', + id: 'f5telemetry_default::My_Consumer', name: 'My_Consumer', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, - traceName: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', type: 'default' }, { @@ -376,7 +376,7 @@ module.exports = { expected: { mappings: { 'My_Namespace::My_System::My_iHealth_Poller': ['My_Namespace::My_Consumer'], - 'My_System::My_iHealth_Poller': ['My_Consumer'] + 'f5telemetry_default::My_System::My_iHealth_Poller': ['f5telemetry_default::My_Consumer'] }, components: [ { @@ -386,7 +386,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System::My_iHealth_Poller', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -434,27 +434,27 @@ module.exports = { passphrase: undefined } }, - id: 'My_System::My_iHealth_Poller', + id: 'f5telemetry_default::My_System::My_iHealth_Poller', name: 'My_iHealth_Poller', systemName: 'My_System', namespace: 'f5telemetry_default', - traceName: 'My_System::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System::My_iHealth_Poller' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer', + id: 'f5telemetry_default::My_Consumer', name: 'My_Consumer', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, - traceName: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', type: 'default' }, { @@ -616,8 +616,8 @@ module.exports = { mappings: { 'My_Namespace::My_System_1::My_iHealth_Poller': ['My_Namespace::My_Consumer'], 'My_Namespace::My_System_2::My_iHealth_Poller': ['My_Namespace::My_Consumer'], - 'My_System_1::My_iHealth_Poller': ['My_Consumer'], - 'My_System_2::My_iHealth_Poller': ['My_Consumer'] + 'f5telemetry_default::My_System_1::My_iHealth_Poller': ['f5telemetry_default::My_Consumer'], + 'f5telemetry_default::My_System_2::My_iHealth_Poller': ['f5telemetry_default::My_Consumer'] }, components: [ { @@ -627,7 +627,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System_1::My_iHealth_Poller', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System_1::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -675,11 +675,11 @@ module.exports = { passphrase: undefined } }, - id: 'My_System_1::My_iHealth_Poller', + id: 'f5telemetry_default::My_System_1::My_iHealth_Poller', name: 'My_iHealth_Poller', namespace: 'f5telemetry_default', systemName: 'My_System_1', - traceName: 'My_System_1::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System_1::My_iHealth_Poller' }, { class: 'Telemetry_iHealth_Poller', @@ -688,7 +688,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System_2::My_iHealth_Poller', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System_2::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -736,27 +736,27 @@ module.exports = { passphrase: undefined } }, - id: 'My_System_2::My_iHealth_Poller', + id: 'f5telemetry_default::My_System_2::My_iHealth_Poller', name: 'My_iHealth_Poller', namespace: 'f5telemetry_default', systemName: 'My_System_2', - traceName: 'My_System_2::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System_2::My_iHealth_Poller' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer', + id: 'f5telemetry_default::My_Consumer', name: 'My_Consumer', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', type: 'output' }, - traceName: 'My_Consumer', + traceName: 'f5telemetry_default::My_Consumer', type: 'default' }, { @@ -1051,7 +1051,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System::iHealthPoller_1', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System::iHealthPoller_1', type: 'output' }, iHealth: { @@ -1099,10 +1099,10 @@ module.exports = { passphrase: undefined } }, - id: 'My_System::iHealthPoller_1', + id: 'f5telemetry_default::My_System::iHealthPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::iHealthPoller_1' + traceName: 'f5telemetry_default::My_System::iHealthPoller_1' }, { class: 'Telemetry_iHealth_Poller', @@ -1111,7 +1111,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System_2::My_iHealth_Poller', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System_2::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -1159,11 +1159,11 @@ module.exports = { passphrase: undefined } }, - id: 'My_System_2::My_iHealth_Poller', + id: 'f5telemetry_default::My_System_2::My_iHealth_Poller', name: 'My_iHealth_Poller', systemName: 'My_System_2', namespace: 'f5telemetry_default', - traceName: 'My_System_2::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System_2::My_iHealth_Poller' }, { class: 'Telemetry_iHealth_Poller', @@ -1424,8 +1424,8 @@ module.exports = { 'My_Namespace::My_System_2::My_iHealth_Poller': ['My_Namespace::My_Consumer_1'], 'My_Namespace_2::My_System::iHealthPoller_1': ['My_Namespace_2::My_Consumer_1'], 'My_Namespace_2::My_System_2::My_iHealth_Poller': ['My_Namespace_2::My_Consumer_1'], - 'My_System::iHealthPoller_1': ['My_Consumer_1'], - 'My_System_2::My_iHealth_Poller': ['My_Consumer_1'] + 'f5telemetry_default::My_System::iHealthPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_System_2::My_iHealth_Poller': ['f5telemetry_default::My_Consumer_1'] }, components: [ { @@ -1436,7 +1436,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System::iHealthPoller_1', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System::iHealthPoller_1', type: 'output' }, iHealth: { @@ -1484,10 +1484,10 @@ module.exports = { passphrase: undefined } }, - id: 'My_System::iHealthPoller_1', + id: 'f5telemetry_default::My_System::iHealthPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::iHealthPoller_1' + traceName: 'f5telemetry_default::My_System::iHealthPoller_1' }, { class: 'Telemetry_iHealth_Poller', @@ -1496,7 +1496,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System_2::My_iHealth_Poller', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System_2::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -1544,27 +1544,27 @@ module.exports = { passphrase: undefined } }, - id: 'My_System_2::My_iHealth_Poller', + id: 'f5telemetry_default::My_System_2::My_iHealth_Poller', name: 'My_iHealth_Poller', systemName: 'My_System_2', namespace: 'f5telemetry_default', - traceName: 'My_System_2::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System_2::My_iHealth_Poller' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -1988,8 +1988,8 @@ module.exports = { 'My_Namespace::My_System_2::My_iHealth_Poller': ['My_Namespace::My_Consumer_1', 'My_Namespace::My_Consumer_2'], 'My_Namespace_2::My_System::iHealthPoller_1': ['My_Namespace_2::My_Consumer_1', 'My_Namespace_2::My_Consumer_2'], 'My_Namespace_2::My_System_2::My_iHealth_Poller': ['My_Namespace_2::My_Consumer_1', 'My_Namespace_2::My_Consumer_2'], - 'My_System::iHealthPoller_1': ['My_Consumer_1', 'My_Consumer_2'], - 'My_System_2::My_iHealth_Poller': ['My_Consumer_1', 'My_Consumer_2'] + 'f5telemetry_default::My_System::iHealthPoller_1': ['f5telemetry_default::My_Consumer_1', 'f5telemetry_default::My_Consumer_2'], + 'f5telemetry_default::My_System_2::My_iHealth_Poller': ['f5telemetry_default::My_Consumer_1', 'f5telemetry_default::My_Consumer_2'] }, components: [ { @@ -2000,7 +2000,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System::iHealthPoller_1', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System::iHealthPoller_1', type: 'output' }, iHealth: { @@ -2048,10 +2048,10 @@ module.exports = { passphrase: undefined } }, - id: 'My_System::iHealthPoller_1', + id: 'f5telemetry_default::My_System::iHealthPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::iHealthPoller_1' + traceName: 'f5telemetry_default::My_System::iHealthPoller_1' }, { class: 'Telemetry_iHealth_Poller', @@ -2060,7 +2060,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System_2::My_iHealth_Poller', + path: '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System_2::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -2108,44 +2108,44 @@ module.exports = { passphrase: undefined } }, - id: 'My_System_2::My_iHealth_Poller', + id: 'f5telemetry_default::My_System_2::My_iHealth_Poller', name: 'My_iHealth_Poller', systemName: 'My_System_2', namespace: 'f5telemetry_default', - traceName: 'My_System_2::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System_2::My_iHealth_Poller' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_2', + id: 'f5telemetry_default::My_Consumer_2', name: 'My_Consumer_2', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_2', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_2', type: 'output' }, - traceName: 'My_Consumer_2', + traceName: 'f5telemetry_default::My_Consumer_2', type: 'default' }, { diff --git a/test/unit/data/configUtilTests/normalizeDeclarationPullConsumerTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationPullConsumerTestsData.js index 70dadcae..8b3a68e9 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationPullConsumerTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationPullConsumerTestsData.js @@ -136,12 +136,12 @@ module.exports = { }, expected: { mappings: { - My_Pull_Consumer: [ - 'My_System::Pull_Poller_1', - 'My_System_2::Pull_Poller_2', - 'My_System_3::Pull_Poller_1', - 'My_System_3::Pull_Poller_2', - 'Pull_Poller_3::Pull_Poller_3' + 'f5telemetry_default::My_Pull_Consumer': [ + 'f5telemetry_default::My_System::Pull_Poller_1', + 'f5telemetry_default::My_System_2::Pull_Poller_2', + 'f5telemetry_default::My_System_3::Pull_Poller_1', + 'f5telemetry_default::My_System_3::Pull_Poller_2', + 'f5telemetry_default::Pull_Poller_3::Pull_Poller_3' ], 'My_Namespace::My_Pull_Consumer': [ 'My_Namespace::My_System::Pull_Poller_1', @@ -160,18 +160,18 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Pull_Consumer.My_Pull_Consumer', + path: '/var/tmp/telemetry/Telemetry_Pull_Consumer.f5telemetry_default::My_Pull_Consumer', type: 'output' }, name: 'My_Pull_Consumer', namespace: 'f5telemetry_default', - traceName: 'My_Pull_Consumer', + traceName: 'f5telemetry_default::My_Pull_Consumer', systemPollers: [ 'Pull_Poller_1', 'Pull_Poller_2', 'Pull_Poller_3' ], - id: 'My_Pull_Consumer' + id: 'f5telemetry_default::My_Pull_Consumer' }, { class: 'Telemetry_Pull_Consumer', @@ -205,10 +205,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::Pull_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::Pull_Poller_1', type: 'output' }, - traceName: 'My_System::Pull_Poller_1', + traceName: 'f5telemetry_default::My_System::Pull_Poller_1', connection: { host: 'host1', port: 8100, @@ -232,7 +232,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System::Pull_Poller_1' + id: 'f5telemetry_default::My_System::Pull_Poller_1' }, { class: 'Telemetry_System_Poller', @@ -245,10 +245,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_2::Pull_Poller_2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_2::Pull_Poller_2', type: 'output' }, - traceName: 'My_System_2::Pull_Poller_2', + traceName: 'f5telemetry_default::My_System_2::Pull_Poller_2', connection: { host: 'host1', port: 8100, @@ -272,7 +272,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System_2::Pull_Poller_2' + id: 'f5telemetry_default::My_System_2::Pull_Poller_2' }, { class: 'Telemetry_System_Poller', @@ -285,10 +285,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_3::Pull_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_3::Pull_Poller_1', type: 'output' }, - traceName: 'My_System_3::Pull_Poller_1', + traceName: 'f5telemetry_default::My_System_3::Pull_Poller_1', connection: { host: 'host1', port: 8100, @@ -312,7 +312,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System_3::Pull_Poller_1' + id: 'f5telemetry_default::My_System_3::Pull_Poller_1' }, { class: 'Telemetry_System_Poller', @@ -325,10 +325,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_3::Pull_Poller_2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_3::Pull_Poller_2', type: 'output' }, - traceName: 'My_System_3::Pull_Poller_2', + traceName: 'f5telemetry_default::My_System_3::Pull_Poller_2', connection: { host: 'host1', port: 8100, @@ -352,7 +352,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System_3::Pull_Poller_2' + id: 'f5telemetry_default::My_System_3::Pull_Poller_2' }, { interval: 90, @@ -365,10 +365,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_3::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_3::SystemPoller_1', type: 'output' }, - traceName: 'My_System_3::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_3::SystemPoller_1', connection: { host: 'host1', port: 8100, @@ -392,7 +392,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System_3::SystemPoller_1' + id: 'f5telemetry_default::My_System_3::SystemPoller_1' }, { class: 'Telemetry_System_Poller', @@ -405,10 +405,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_3::Regular_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_3::Regular_Poller_1', type: 'output' }, - traceName: 'My_System_3::Regular_Poller_1', + traceName: 'f5telemetry_default::My_System_3::Regular_Poller_1', connection: { host: 'host1', port: 8100, @@ -432,7 +432,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System_3::Regular_Poller_1' + id: 'f5telemetry_default::My_System_3::Regular_Poller_1' }, { class: 'Telemetry_System_Poller', @@ -685,10 +685,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.Pull_Poller_3::Pull_Poller_3', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::Pull_Poller_3::Pull_Poller_3', type: 'output' }, - traceName: 'Pull_Poller_3::Pull_Poller_3', + traceName: 'f5telemetry_default::Pull_Poller_3::Pull_Poller_3', connection: { host: 'localhost', port: 8100, @@ -712,7 +712,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'Pull_Poller_3::Pull_Poller_3' + id: 'f5telemetry_default::Pull_Poller_3::Pull_Poller_3' }, { class: 'Telemetry_System_Poller', @@ -725,10 +725,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.Pull_Poller_4::Pull_Poller_4', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::Pull_Poller_4::Pull_Poller_4', type: 'output' }, - traceName: 'Pull_Poller_4::Pull_Poller_4', + traceName: 'f5telemetry_default::Pull_Poller_4::Pull_Poller_4', connection: { host: 'localhost', port: 8100, @@ -752,7 +752,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'Pull_Poller_4::Pull_Poller_4' + id: 'f5telemetry_default::Pull_Poller_4::Pull_Poller_4' }, { class: 'Telemetry_System_Poller', @@ -865,8 +865,8 @@ module.exports = { }, expected: { mappings: { - My_Pull_Consumer: [ - 'Pull_Poller_1::Pull_Poller_1' + 'f5telemetry_default::My_Pull_Consumer': [ + 'f5telemetry_default::Pull_Poller_1::Pull_Poller_1' ], 'My_Namespace::My_Pull_Consumer': [ 'My_Namespace::Pull_Poller_1::Pull_Poller_1' @@ -881,16 +881,16 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Pull_Consumer.My_Pull_Consumer', + path: '/var/tmp/telemetry/Telemetry_Pull_Consumer.f5telemetry_default::My_Pull_Consumer', type: 'output' }, name: 'My_Pull_Consumer', namespace: 'f5telemetry_default', - traceName: 'My_Pull_Consumer', + traceName: 'f5telemetry_default::My_Pull_Consumer', systemPollers: [ 'Pull_Poller_1' ], - id: 'My_Pull_Consumer' + id: 'f5telemetry_default::My_Pull_Consumer' }, { class: 'Telemetry_Pull_Consumer', @@ -922,10 +922,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.Pull_Poller_1::Pull_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::Pull_Poller_1::Pull_Poller_1', type: 'output' }, - traceName: 'Pull_Poller_1::Pull_Poller_1', + traceName: 'f5telemetry_default::Pull_Poller_1::Pull_Poller_1', connection: { host: 'localhost', port: 8100, @@ -949,7 +949,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'Pull_Poller_1::Pull_Poller_1' + id: 'f5telemetry_default::Pull_Poller_1::Pull_Poller_1' }, { class: 'Telemetry_System_Poller', diff --git a/test/unit/data/configUtilTests/normalizeDeclarationSystemPollerTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationSystemPollerTestsData.js index 64820aed..4eb53fdb 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationSystemPollerTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationSystemPollerTestsData.js @@ -72,8 +72,8 @@ module.exports = { }, expected: { mappings: { - 'My_Poller_1::My_Poller_1': ['My_Consumer_1'], - 'My_Poller_2::My_Poller_2': ['My_Consumer_1'], + 'f5telemetry_default::My_Poller_1::My_Poller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_Poller_2::My_Poller_2': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_Poller_1::My_Poller_1': ['My_Namespace::My_Consumer_1'], 'My_Namespace::My_Poller_2::My_Poller_2': ['My_Namespace::My_Consumer_1'] }, @@ -84,16 +84,16 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_Poller_1::My_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_Poller_1::My_Poller_1', type: 'output' }, interval: 300, enable: true, name: 'My_Poller_1', - id: 'My_Poller_1::My_Poller_1', + id: 'f5telemetry_default::My_Poller_1::My_Poller_1', namespace: 'f5telemetry_default', systemName: 'My_Poller_1', - traceName: 'My_Poller_1::My_Poller_1', + traceName: 'f5telemetry_default::My_Poller_1::My_Poller_1', connection: { host: 'localhost', port: 8100, @@ -124,16 +124,16 @@ module.exports = { enable: true, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_Poller_2::My_Poller_2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_Poller_2::My_Poller_2', type: 'output' }, interval: 600, enable: true, name: 'My_Poller_2', - id: 'My_Poller_2::My_Poller_2', + id: 'f5telemetry_default::My_Poller_2::My_Poller_2', namespace: 'f5telemetry_default', systemName: 'My_Poller_2', - traceName: 'My_Poller_2::My_Poller_2', + traceName: 'f5telemetry_default::My_Poller_2::My_Poller_2', connection: { host: 'host2', port: 8102, @@ -168,17 +168,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -345,8 +345,8 @@ module.exports = { }, expected: { mappings: { - 'My_System_1::My_Poller_1': ['My_Consumer_1'], - 'My_System_2::My_Poller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_System_1::My_Poller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_System_2::My_Poller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System_1::My_Poller_1': ['My_Namespace::My_Consumer_1'], 'My_Namespace::My_System_2::My_Poller_1': ['My_Namespace::My_Consumer_1'] }, @@ -363,10 +363,10 @@ module.exports = { interval: 500, enable: false, // system value kept name: 'My_Poller_1', - id: 'My_System_1::My_Poller_1', + id: 'f5telemetry_default::My_System_1::My_Poller_1', namespace: 'f5telemetry_default', systemName: 'My_System_1', - traceName: 'My_System_1::My_Poller_1', + traceName: 'f5telemetry_default::My_System_1::My_Poller_1', connection: { host: 'host1', port: 8100, @@ -397,16 +397,16 @@ module.exports = { enable: true, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_2::My_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_2::My_Poller_1', type: 'output' }, interval: 500, enable: true, name: 'My_Poller_1', - id: 'My_System_2::My_Poller_1', + id: 'f5telemetry_default::My_System_2::My_Poller_1', namespace: 'f5telemetry_default', systemName: 'My_System_2', - traceName: 'My_System_2::My_Poller_1', + traceName: 'f5telemetry_default::My_System_2::My_Poller_1', connection: { host: 'host2', port: 8100, @@ -435,17 +435,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -628,7 +628,7 @@ module.exports = { }, expected: { mappings: { - 'My_Poller_1::My_Poller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_Poller_1::My_Poller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_Poller_1::My_Poller_1': ['My_Namespace::My_Consumer_1'] }, components: [ @@ -651,10 +651,10 @@ module.exports = { } }, name: 'My_Poller_1', - id: 'My_Poller_1::My_Poller_1', + id: 'f5telemetry_default::My_Poller_1::My_Poller_1', namespace: 'f5telemetry_default', systemName: 'My_Poller_1', - traceName: 'My_Poller_1::My_Poller_1', + traceName: 'f5telemetry_default::My_Poller_1::My_Poller_1', connection: { host: 'host1', port: 443, @@ -688,17 +688,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -865,7 +865,7 @@ module.exports = { }, expected: { mappings: { - 'My_System::My_Poller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_System::My_Poller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System::My_Poller_1': ['My_Namespace::My_Consumer_1'] }, components: [ @@ -888,10 +888,10 @@ module.exports = { } }, name: 'My_Poller_1', - id: 'My_System::My_Poller_1', + id: 'f5telemetry_default::My_System::My_Poller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::My_Poller_1', + traceName: 'f5telemetry_default::My_System::My_Poller_1', connection: { host: 'host1', port: 8100, @@ -921,17 +921,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -1078,7 +1078,7 @@ module.exports = { }, expected: { mappings: { - 'My_System::Poller_With_Actions': ['My_Consumer_1'], + 'f5telemetry_default::My_System::Poller_With_Actions': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System::Poller_With_Actions': ['My_Namespace::My_Consumer_1'] }, components: [ @@ -1089,15 +1089,15 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::Poller_With_Actions', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::Poller_With_Actions', type: 'output' }, interval: 300, name: 'Poller_With_Actions', - id: 'My_System::Poller_With_Actions', + id: 'f5telemetry_default::My_System::Poller_With_Actions', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::Poller_With_Actions', + traceName: 'f5telemetry_default::My_System::Poller_With_Actions', connection: { host: 'host1', port: 8100, @@ -1139,17 +1139,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -1297,7 +1297,7 @@ module.exports = { }, expected: { mappings: { - 'My_System::SystemPoller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_System::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System::SystemPoller_1': ['My_Namespace::My_Consumer_1'] }, components: [ @@ -1308,15 +1308,15 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, interval: 300, name: 'SystemPoller_1', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', connection: { host: 'host1', port: 8100, @@ -1358,17 +1358,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -1478,7 +1478,7 @@ module.exports = { }, expected: { mappings: { - 'My_System::SystemPoller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_System::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System::SystemPoller_1': ['My_Namespace::My_Consumer_1'] }, components: [ @@ -1489,15 +1489,15 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, interval: 234, name: 'SystemPoller_1', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', connection: { host: 'host1', port: 8100, @@ -1527,17 +1527,17 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { @@ -1696,9 +1696,9 @@ module.exports = { }, expected: { mappings: { - 'My_System::SystemPoller_1': ['My_Consumer_1'], - 'My_System::My_Poller_2': ['My_Consumer_1'], - 'My_Poller_1::My_Poller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_System::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_System::My_Poller_2': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_Poller_1::My_Poller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System::SystemPoller_1': ['My_Namespace::My_Consumer_1'], 'My_Namespace::My_System::My_Poller_2': ['My_Namespace::My_Consumer_1'], 'My_Namespace::My_Poller_1::My_Poller_1': ['My_Namespace::My_Consumer_1'], @@ -1722,7 +1722,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, allowSelfSignedCert: false, @@ -1731,8 +1731,8 @@ module.exports = { compressionType: 'gzip', name: 'My_Consumer_1', namespace: 'f5telemetry_default', - traceName: 'My_Consumer_1', - id: 'My_Consumer_1' + traceName: 'f5telemetry_default::My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1' }, { class: 'Telemetry_Consumer', @@ -1789,10 +1789,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', connection: { host: 'host3', port: 8100, @@ -1816,7 +1816,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System::SystemPoller_1' + id: 'f5telemetry_default::My_System::SystemPoller_1' }, { class: 'Telemetry_System_Poller', @@ -1829,10 +1829,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::My_Poller_2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::My_Poller_2', type: 'output' }, - traceName: 'My_System::My_Poller_2', + traceName: 'f5telemetry_default::My_System::My_Poller_2', connection: { host: 'host3', port: 8100, @@ -1856,7 +1856,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_System::My_Poller_2' + id: 'f5telemetry_default::My_System::My_Poller_2' }, { interval: 234, @@ -2029,10 +2029,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_Poller_1::My_Poller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_Poller_1::My_Poller_1', type: 'output' }, - traceName: 'My_Poller_1::My_Poller_1', + traceName: 'f5telemetry_default::My_Poller_1::My_Poller_1', connection: { host: 'host1', port: 8100, @@ -2056,7 +2056,7 @@ module.exports = { username: undefined, passphrase: undefined }, - id: 'My_Poller_1::My_Poller_1' + id: 'f5telemetry_default::My_Poller_1::My_Poller_1' }, { class: 'Telemetry_System_Poller', @@ -2173,15 +2173,15 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, interval: 234, name: 'SystemPoller_1', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', connection: { host: 'localhost', port: 8100, @@ -2336,8 +2336,8 @@ module.exports = { }, expected: { mappings: { - 'My_System::SystemPoller_1': ['My_Consumer_1', 'My_Consumer_2'], - 'My_System_2::SystemPoller_1': ['My_Consumer_1', 'My_Consumer_2'], + 'f5telemetry_default::My_System::SystemPoller_1': ['f5telemetry_default::My_Consumer_1', 'f5telemetry_default::My_Consumer_2'], + 'f5telemetry_default::My_System_2::SystemPoller_1': ['f5telemetry_default::My_Consumer_1', 'f5telemetry_default::My_Consumer_2'], 'My_Namespace::My_System::SystemPoller_1': ['My_Namespace::My_Consumer_1', 'My_Namespace::My_Consumer_2'], 'My_Namespace::My_System_2::SystemPoller_1': ['My_Namespace::My_Consumer_1', 'My_Namespace::My_Consumer_2'], 'My_Namespace_2::My_System::SystemPoller_1': ['My_Namespace_2::My_Consumer_1', 'My_Namespace_2::My_Consumer_2'], @@ -2351,15 +2351,15 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, interval: 234, name: 'SystemPoller_1', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', connection: { host: 'host1', port: 8100, @@ -2392,15 +2392,15 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_2::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_2::SystemPoller_1', type: 'output' }, interval: 234, name: 'SystemPoller_1', - id: 'My_System_2::SystemPoller_1', + id: 'f5telemetry_default::My_System_2::SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System_2', - traceName: 'My_System_2::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_2::SystemPoller_1', connection: { host: 'host2', port: 8100, @@ -2430,34 +2430,34 @@ module.exports = { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', type: 'default' }, { class: 'Telemetry_Consumer', allowSelfSignedCert: false, enable: true, - id: 'My_Consumer_2', + id: 'f5telemetry_default::My_Consumer_2', name: 'My_Consumer_2', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_2', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_2', type: 'output' }, - traceName: 'My_Consumer_2', + traceName: 'f5telemetry_default::My_Consumer_2', type: 'default' }, { diff --git a/test/unit/data/configUtilTests/normalizeDeclarationSystemTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationSystemTestsData.js index 37028af9..7bb45f66 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationSystemTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationSystemTestsData.js @@ -60,24 +60,24 @@ module.exports = { }, expected: { mappings: { - 'My_System_1::SystemPoller_1': ['My_Consumer_1'], - 'My_System_1::SystemPoller_2': ['My_Consumer_1'], - 'My_System_2::SystemPoller_1': ['My_Consumer_1'], - 'My_System_2::SystemPoller_2': ['My_Consumer_1'] + 'f5telemetry_default::My_System_1::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_System_1::SystemPoller_2': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_System_2::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::My_System_2::SystemPoller_2': ['f5telemetry_default::My_Consumer_1'] }, components: [ { - id: 'My_System_1::SystemPoller_1', + id: 'f5telemetry_default::My_System_1::SystemPoller_1', name: 'SystemPoller_1', class: 'Telemetry_System_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_1::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_1::SystemPoller_1', type: 'output' }, - traceName: 'My_System_1::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_1::SystemPoller_1', systemName: 'My_System_1', namespace: 'f5telemetry_default', enable: true, @@ -107,17 +107,17 @@ module.exports = { } }, { - id: 'My_System_1::SystemPoller_2', + id: 'f5telemetry_default::My_System_1::SystemPoller_2', name: 'SystemPoller_2', class: 'Telemetry_System_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_1::SystemPoller_2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_1::SystemPoller_2', type: 'output' }, - traceName: 'My_System_1::SystemPoller_2', + traceName: 'f5telemetry_default::My_System_1::SystemPoller_2', systemName: 'My_System_1', namespace: 'f5telemetry_default', enable: true, @@ -149,8 +149,8 @@ module.exports = { { class: 'Telemetry_System_Poller', name: 'SystemPoller_2', - id: 'My_System_2::SystemPoller_2', - traceName: 'My_System_2::SystemPoller_2', + id: 'f5telemetry_default::My_System_2::SystemPoller_2', + traceName: 'f5telemetry_default::My_System_2::SystemPoller_2', systemName: 'My_System_2', namespace: 'f5telemetry_default', enable: true, @@ -159,7 +159,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_2::SystemPoller_2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_2::SystemPoller_2', type: 'output' }, dataOpts: { @@ -187,17 +187,17 @@ module.exports = { } }, { - id: 'My_System_2::SystemPoller_1', + id: 'f5telemetry_default::My_System_2::SystemPoller_1', name: 'SystemPoller_1', class: 'Telemetry_System_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_2::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_2::SystemPoller_1', type: 'output' }, - traceName: 'My_System_2::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_2::SystemPoller_1', systemName: 'My_System_2', namespace: 'f5telemetry_default', enable: true, @@ -230,15 +230,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, type: 'default' @@ -328,14 +328,14 @@ module.exports = { }, expected: { mappings: { - 'My_System_1::SystemPoller_1': ['My_Consumer_1'], + 'f5telemetry_default::My_System_1::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::My_System_1::SystemPoller_1': ['My_Namespace::My_Consumer_1'], 'My_Namespace_2::My_System_1::SystemPoller_1': ['My_Namespace_2::My_Consumer_1'] }, components: [ { name: 'SystemPoller_1', - id: 'My_System_1::SystemPoller_1', + id: 'f5telemetry_default::My_System_1::SystemPoller_1', class: 'Telemetry_System_Poller', namespace: 'f5telemetry_default', enable: true, @@ -343,11 +343,11 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_1::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_1::SystemPoller_1', type: 'output' }, systemName: 'My_System_1', - traceName: 'My_System_1::SystemPoller_1', + traceName: 'f5telemetry_default::My_System_1::SystemPoller_1', interval: 300, dataOpts: { actions: [ @@ -375,8 +375,8 @@ module.exports = { }, { name: 'My_Consumer_1', - traceName: 'My_Consumer_1', - id: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', namespace: 'f5telemetry_default', allowSelfSignedCert: false, class: 'Telemetry_Consumer', @@ -395,7 +395,7 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, compressionType: 'gzip' @@ -613,11 +613,11 @@ module.exports = { }, expected: { mappings: { - 'System_Nested_Poller_Single::SystemPoller_1': ['My_Consumer_1'], - 'System_Ref_Poller::Poller1': ['My_Consumer_1'], - 'System_Nested_Poller_Array::SystemPoller_1': ['My_Consumer_1'], - 'System_Nested_Poller_Array::Poller1': ['My_Consumer_1'], - 'System_Nested_Poller_Array::Poller2': ['My_Consumer_1'], + 'f5telemetry_default::System_Nested_Poller_Single::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::System_Ref_Poller::Poller1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::System_Nested_Poller_Array::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::System_Nested_Poller_Array::Poller1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::System_Nested_Poller_Array::Poller2': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::System_Nested_Poller_Single::SystemPoller_1': ['My_Namespace::My_Consumer_1'], 'My_Namespace::System_Ref_Poller::Poller1': ['My_Namespace::My_Consumer_1'], 'My_Namespace::System_Nested_Poller_Array::SystemPoller_1': ['My_Namespace::My_Consumer_1'], @@ -627,7 +627,7 @@ module.exports = { components: [ { name: 'SystemPoller_1', - id: 'System_Nested_Poller_Single::SystemPoller_1', + id: 'f5telemetry_default::System_Nested_Poller_Single::SystemPoller_1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -636,10 +636,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Nested_Poller_Single::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Nested_Poller_Single::SystemPoller_1', type: 'output' }, - traceName: 'System_Nested_Poller_Single::SystemPoller_1', + traceName: 'f5telemetry_default::System_Nested_Poller_Single::SystemPoller_1', systemName: 'System_Nested_Poller_Single', dataOpts: { actions: [ @@ -667,7 +667,7 @@ module.exports = { }, { name: 'Poller1', - id: 'System_Ref_Poller::Poller1', + id: 'f5telemetry_default::System_Ref_Poller::Poller1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -676,10 +676,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Ref_Poller::Poller1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Ref_Poller::Poller1', type: 'output' }, - traceName: 'System_Ref_Poller::Poller1', + traceName: 'f5telemetry_default::System_Ref_Poller::Poller1', systemName: 'System_Ref_Poller', dataOpts: { actions: [ @@ -707,7 +707,7 @@ module.exports = { }, { name: 'Poller2', - id: 'System_Nested_Poller_Array::Poller2', + id: 'f5telemetry_default::System_Nested_Poller_Array::Poller2', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -716,10 +716,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Nested_Poller_Array::Poller2', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Nested_Poller_Array::Poller2', type: 'output' }, - traceName: 'System_Nested_Poller_Array::Poller2', + traceName: 'f5telemetry_default::System_Nested_Poller_Array::Poller2', systemName: 'System_Nested_Poller_Array', dataOpts: { actions: [ @@ -747,7 +747,7 @@ module.exports = { }, { name: 'SystemPoller_1', - id: 'System_Nested_Poller_Array::SystemPoller_1', + id: 'f5telemetry_default::System_Nested_Poller_Array::SystemPoller_1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -756,10 +756,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Nested_Poller_Array::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Nested_Poller_Array::SystemPoller_1', type: 'output' }, - traceName: 'System_Nested_Poller_Array::SystemPoller_1', + traceName: 'f5telemetry_default::System_Nested_Poller_Array::SystemPoller_1', systemName: 'System_Nested_Poller_Array', dataOpts: { actions: [ @@ -786,7 +786,7 @@ module.exports = { } }, { - id: 'System_Nested_Poller_Array::Poller1', + id: 'f5telemetry_default::System_Nested_Poller_Array::Poller1', name: 'Poller1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', @@ -796,10 +796,10 @@ module.exports = { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Nested_Poller_Array::Poller1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Nested_Poller_Array::Poller1', type: 'output' }, - traceName: 'System_Nested_Poller_Array::Poller1', + traceName: 'f5telemetry_default::System_Nested_Poller_Array::Poller1', systemName: 'System_Nested_Poller_Array', dataOpts: { actions: [ @@ -829,15 +829,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, type: 'default' @@ -1198,9 +1198,9 @@ module.exports = { }, expected: { mappings: { - 'System_Trace_Undef_Poller_String::SystemPoller_1': ['My_Consumer_1'], - 'System_Remote_Ref_Poller::Poller_Trace_True': ['My_Consumer_1'], - 'System_Localhost_Ref_Poller::Poller_Trace_False': ['My_Consumer_1'], + 'f5telemetry_default::System_Trace_Undef_Poller_String::SystemPoller_1': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::System_Remote_Ref_Poller::Poller_Trace_True': ['f5telemetry_default::My_Consumer_1'], + 'f5telemetry_default::System_Localhost_Ref_Poller::Poller_Trace_False': ['f5telemetry_default::My_Consumer_1'], 'My_Namespace::System_Trace_Undef_Poller_String::SystemPoller_1': ['My_Namespace::My_Consumer_1'], 'My_Namespace::System_Remote_Ref_Poller::Poller_Trace_True': ['My_Namespace::My_Consumer_1'], 'My_Namespace::System_Localhost_Ref_Poller::Poller_Trace_False': ['My_Namespace::My_Consumer_1'] @@ -1217,11 +1217,11 @@ module.exports = { enable: true, interval: 300, class: 'Telemetry_System_Poller', - id: 'System_Trace_Undef_Poller_String::SystemPoller_1', + id: 'f5telemetry_default::System_Trace_Undef_Poller_String::SystemPoller_1', name: 'SystemPoller_1', namespace: 'f5telemetry_default', systemName: 'System_Trace_Undef_Poller_String', - traceName: 'System_Trace_Undef_Poller_String::SystemPoller_1', + traceName: 'f5telemetry_default::System_Trace_Undef_Poller_String::SystemPoller_1', connection: { host: 'host1', port: 8100, @@ -1258,15 +1258,15 @@ module.exports = { }, enable: true, name: 'Poller_Trace_True', - id: 'System_Remote_Ref_Poller::Poller_Trace_True', + id: 'f5telemetry_default::System_Remote_Ref_Poller::Poller_Trace_True', namespace: 'f5telemetry_default', systemName: 'System_Remote_Ref_Poller', - traceName: 'System_Remote_Ref_Poller::Poller_Trace_True', + traceName: 'f5telemetry_default::System_Remote_Ref_Poller::Poller_Trace_True', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Remote_Ref_Poller::Poller_Trace_True', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Remote_Ref_Poller::Poller_Trace_True', type: 'output' }, connection: { @@ -1304,15 +1304,15 @@ module.exports = { }, enable: true, name: 'Poller_Trace_False', - id: 'System_Localhost_Ref_Poller::Poller_Trace_False', + id: 'f5telemetry_default::System_Localhost_Ref_Poller::Poller_Trace_False', namespace: 'f5telemetry_default', systemName: 'System_Localhost_Ref_Poller', - traceName: 'System_Localhost_Ref_Poller::Poller_Trace_False', + traceName: 'f5telemetry_default::System_Localhost_Ref_Poller::Poller_Trace_False', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.System_Localhost_Ref_Poller::Poller_Trace_False', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::System_Localhost_Ref_Poller::Poller_Trace_False', type: 'output' }, connection: { @@ -1342,15 +1342,15 @@ module.exports = { allowSelfSignedCert: false, class: 'Telemetry_Consumer', enable: true, - id: 'My_Consumer_1', + id: 'f5telemetry_default::My_Consumer_1', name: 'My_Consumer_1', - traceName: 'My_Consumer_1', + traceName: 'f5telemetry_default::My_Consumer_1', namespace: 'f5telemetry_default', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer_1', + path: '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer_1', type: 'output' }, type: 'default' diff --git a/test/unit/data/configUtilTests/normalizeDeclarationTraceValueTestsData.js b/test/unit/data/configUtilTests/normalizeDeclarationTraceValueTestsData.js index c53ef9f6..0fe86211 100644 --- a/test/unit/data/configUtilTests/normalizeDeclarationTraceValueTestsData.js +++ b/test/unit/data/configUtilTests/normalizeDeclarationTraceValueTestsData.js @@ -143,7 +143,7 @@ function generateDeclarationAndExpectedOutput(trace) { tags: undefined }, enable: true, - id: 'My_Poller_2::My_Poller_2', + id: 'f5telemetry_default::My_Poller_2::My_Poller_2', interval: 300, name: 'My_Poller_2', namespace: 'f5telemetry_default', @@ -152,10 +152,10 @@ function generateDeclarationAndExpectedOutput(trace) { enable: !!trace.systemPoller, encoding: 'utf8', maxRecords: 10, - path: typeof trace.systemPoller === 'string' ? trace.systemPoller : '/var/tmp/telemetry/Telemetry_System_Poller.My_Poller_2::My_Poller_2', + path: typeof trace.systemPoller === 'string' ? trace.systemPoller : '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_Poller_2::My_Poller_2', type: 'output' }, - traceName: 'My_Poller_2::My_Poller_2' + traceName: 'f5telemetry_default::My_Poller_2::My_Poller_2' }, { class: 'Telemetry_System_Poller', @@ -183,7 +183,7 @@ function generateDeclarationAndExpectedOutput(trace) { tags: undefined }, enable: true, - id: 'My_System::My_Poller_1', + id: 'f5telemetry_default::My_System::My_Poller_1', interval: 300, name: 'My_Poller_1', namespace: 'f5telemetry_default', @@ -192,10 +192,10 @@ function generateDeclarationAndExpectedOutput(trace) { enable: !!trace.expectedSystemPoller, encoding: 'utf8', maxRecords: 10, - path: typeof trace.expectedSystemPoller === 'string' ? trace.expectedSystemPoller : '/var/tmp/telemetry/Telemetry_System_Poller.My_System::My_Poller_1', + path: typeof trace.expectedSystemPoller === 'string' ? trace.expectedSystemPoller : '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::My_Poller_1', type: 'output' }, - traceName: 'My_System::My_Poller_1' + traceName: 'f5telemetry_default::My_System::My_Poller_1' }, { class: 'Telemetry_System_Poller', @@ -223,7 +223,7 @@ function generateDeclarationAndExpectedOutput(trace) { tags: undefined }, enable: true, - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', interval: 60, name: 'SystemPoller_1', namespace: 'f5telemetry_default', @@ -232,10 +232,10 @@ function generateDeclarationAndExpectedOutput(trace) { enable: !!trace.expectedSystemPoller, encoding: 'utf8', maxRecords: 10, - path: typeof trace.expectedSystemPoller === 'string' ? trace.expectedSystemPoller : '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: typeof trace.expectedSystemPoller === 'string' ? trace.expectedSystemPoller : '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, - traceName: 'My_System::SystemPoller_1' + traceName: 'f5telemetry_default::My_System::SystemPoller_1' }, { class: 'Telemetry_iHealth_Poller', @@ -245,7 +245,7 @@ function generateDeclarationAndExpectedOutput(trace) { enable: !!trace.expectedIHealthPoller, encoding: 'utf8', maxRecords: 10, - path: typeof trace.expectedIHealthPoller === 'string' ? trace.expectedIHealthPoller : '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System::iHealthPoller_1', + path: typeof trace.expectedIHealthPoller === 'string' ? trace.expectedIHealthPoller : '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System::iHealthPoller_1', type: 'output' }, iHealth: { @@ -293,10 +293,10 @@ function generateDeclarationAndExpectedOutput(trace) { passphrase: undefined } }, - id: 'My_System::iHealthPoller_1', + id: 'f5telemetry_default::My_System::iHealthPoller_1', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::iHealthPoller_1' + traceName: 'f5telemetry_default::My_System::iHealthPoller_1' }, { class: 'Telemetry_iHealth_Poller', @@ -306,7 +306,7 @@ function generateDeclarationAndExpectedOutput(trace) { enable: !!trace.expectedIHealthPoller, encoding: 'utf8', maxRecords: 10, - path: typeof trace.expectedIHealthPoller === 'string' ? trace.expectedIHealthPoller : '/var/tmp/telemetry/Telemetry_iHealth_Poller.My_System_2::My_iHealth_Poller', + path: typeof trace.expectedIHealthPoller === 'string' ? trace.expectedIHealthPoller : '/var/tmp/telemetry/Telemetry_iHealth_Poller.f5telemetry_default::My_System_2::My_iHealth_Poller', type: 'output' }, iHealth: { @@ -354,10 +354,10 @@ function generateDeclarationAndExpectedOutput(trace) { passphrase: undefined } }, - id: 'My_System_2::My_iHealth_Poller', + id: 'f5telemetry_default::My_System_2::My_iHealth_Poller', namespace: 'f5telemetry_default', systemName: 'My_System_2', - traceName: 'My_System_2::My_iHealth_Poller' + traceName: 'f5telemetry_default::My_System_2::My_iHealth_Poller' } ] } diff --git a/test/unit/data/propertiesJsonTests/collectVirtualServers.js b/test/unit/data/propertiesJsonTests/collectVirtualServers.js index 8a5b6450..8e9f5ba4 100644 --- a/test/unit/data/propertiesJsonTests/collectVirtualServers.js +++ b/test/unit/data/propertiesJsonTests/collectVirtualServers.js @@ -84,9 +84,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '10.11.0.2:80', enabledState: 'enabled', @@ -104,9 +106,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '192.168.1.10%10', enabledState: 'enabled', @@ -457,9 +461,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '10.11.0.2:80', enabledState: 'enabled', @@ -699,9 +705,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '10.11.0.2:80', enabledState: 'enabled', @@ -908,9 +916,11 @@ module.exports = { 'clientside.bitsIn': 0, 'clientside.bitsOut': 0, 'clientside.curConns': 0, + 'clientside.evictedConns': 0, 'clientside.maxConns': 0, 'clientside.pktsIn': 0, 'clientside.pktsOut': 0, + 'clientside.slowKilled': 0, 'clientside.totConns': 0, destination: '10.11.0.2:80', enabledState: 'enabled', diff --git a/test/unit/data/systemPollerTestsData.js b/test/unit/data/systemPollerTestsData.js index 3f4168e3..adf97358 100644 --- a/test/unit/data/systemPollerTestsData.js +++ b/test/unit/data/systemPollerTestsData.js @@ -173,7 +173,7 @@ module.exports = { }, sysOrPollerName: 'testSystem', expectedConfig: [{ - name: 'testSystem::SystemPoller_1' + name: 'f5telemetry_default::testSystem::SystemPoller_1' }] }, { @@ -191,7 +191,7 @@ module.exports = { }, sysOrPollerName: 'testSystem', expectedConfig: [{ - name: 'testSystem::systemPoller' + name: 'f5telemetry_default::testSystem::systemPoller' }] }, { @@ -224,7 +224,7 @@ module.exports = { }, sysOrPollerName: 'systemPoller', expectedConfig: [{ - name: 'systemPoller::systemPoller' + name: 'f5telemetry_default::systemPoller::systemPoller' }] }, { @@ -251,13 +251,13 @@ module.exports = { sysOrPollerName: 'testSystem', expectedConfig: [ { - name: 'testSystem::systemPoller' + name: 'f5telemetry_default::testSystem::systemPoller' }, { - name: 'testSystem::SystemPoller_1' + name: 'f5telemetry_default::testSystem::SystemPoller_1' }, { - name: 'testSystem::SystemPoller_2' + name: 'f5telemetry_default::testSystem::SystemPoller_2' } ] }, @@ -300,9 +300,9 @@ module.exports = { }, sysOrPollerName: 'My_System', expectedConfig: [ - { name: 'My_System::My_System_Poller' }, - { name: 'My_System::The_Other_System_Poller' }, - { name: 'My_System::SystemPoller_2' } + { name: 'f5telemetry_default::My_System::My_System_Poller' }, + { name: 'f5telemetry_default::My_System::The_Other_System_Poller' }, + { name: 'f5telemetry_default::My_System::SystemPoller_2' } ] }, { @@ -316,7 +316,7 @@ module.exports = { }, sysOrPollerName: 'systemPoller', expectedConfig: [{ - name: 'systemPoller::systemPoller' + name: 'f5telemetry_default::systemPoller::systemPoller' }] }, { @@ -335,7 +335,7 @@ module.exports = { includeDisabled: false }, expectedConfig: [{ - name: 'testSystem::SystemPoller_1' + name: 'f5telemetry_default::testSystem::SystemPoller_1' }] }, { @@ -354,7 +354,7 @@ module.exports = { includeDisabled: true }, expectedConfig: [{ - name: 'testSystem::SystemPoller_1' + name: 'f5telemetry_default::testSystem::SystemPoller_1' }] }, { @@ -375,7 +375,7 @@ module.exports = { includeDisabled: true }, expectedConfig: [{ - name: 'testSystem::systemPoller' + name: 'f5telemetry_default::testSystem::systemPoller' }] }, { @@ -397,7 +397,7 @@ module.exports = { includeDisabled: true }, expectedConfig: [{ - name: 'testSystem::systemPoller' + name: 'f5telemetry_default::testSystem::systemPoller' }] }, { @@ -427,13 +427,13 @@ module.exports = { }, expectedConfig: [ { - name: 'testSystem::systemPoller' + name: 'f5telemetry_default::testSystem::systemPoller' }, { - name: 'testSystem::SystemPoller_1' + name: 'f5telemetry_default::testSystem::SystemPoller_1' }, { - name: 'testSystem::SystemPoller_2' + name: 'f5telemetry_default::testSystem::SystemPoller_2' } ] }, @@ -451,7 +451,7 @@ module.exports = { includeDisabled: true }, expectedConfig: [{ - name: 'systemPoller::systemPoller' + name: 'f5telemetry_default::systemPoller::systemPoller' }] } ], @@ -473,15 +473,15 @@ module.exports = { enable: true, interval: 300, name: 'My_System_Poller', - id: 'My_System_Poller::My_System_Poller', + id: 'f5telemetry_default::My_System_Poller::My_System_Poller', namespace: 'f5telemetry_default', - traceName: 'My_System_Poller::My_System_Poller', + traceName: 'f5telemetry_default::My_System_Poller::My_System_Poller', systemName: 'My_System_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_Poller::My_System_Poller', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_Poller::My_System_Poller', type: 'output' }, connection: { @@ -584,15 +584,15 @@ module.exports = { enable: true, interval: 300, name: 'My_System_Poller', - id: 'My_System::My_System_Poller', + id: 'f5telemetry_default::My_System::My_System_Poller', namespace: 'f5telemetry_default', systemName: 'My_System', - traceName: 'My_System::My_System_Poller', + traceName: 'f5telemetry_default::My_System::My_System_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::My_System_Poller', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::My_System_Poller', type: 'output' }, connection: { @@ -713,15 +713,15 @@ module.exports = { enable: true, interval: 300, name: 'My_System_Poller', - id: 'My_System::My_System_Poller', + id: 'f5telemetry_default::My_System::My_System_Poller', systemName: 'My_System', namespace: 'f5telemetry_default', - traceName: 'My_System::My_System_Poller', + traceName: 'f5telemetry_default::My_System::My_System_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::My_System_Poller', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::My_System_Poller', type: 'output' }, connection: { @@ -853,15 +853,15 @@ module.exports = { enable: true, interval: 300, name: 'My_Desired_Poller', - id: 'My_System::My_Desired_Poller', + id: 'f5telemetry_default::My_System::My_Desired_Poller', systemName: 'My_System', namespace: 'f5telemetry_default', - traceName: 'My_System::My_Desired_Poller', + traceName: 'f5telemetry_default::My_System::My_Desired_Poller', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::My_Desired_Poller', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::My_Desired_Poller', type: 'output' }, connection: { @@ -1007,15 +1007,15 @@ module.exports = { enable: true, interval: 300, name: 'SystemPoller_1', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', systemName: 'My_System', namespace: 'f5telemetry_default', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', trace: { enable: false, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, connection: { diff --git a/test/unit/declarationTests.js b/test/unit/declarationTests.js index 6f2bf942..fd89ae2b 100644 --- a/test/unit/declarationTests.js +++ b/test/unit/declarationTests.js @@ -4409,6 +4409,42 @@ describe('Declarations', () => { }); }); + describe('DataDog', () => { + it('should pass minimal declaration', () => validateMinimal( + { + type: 'DataDog', + apiKey: 'test' + }, + { + type: 'DataDog', + apiKey: 'test' + } + )); + + it('should allow full declaration', () => validateFull( + { + type: 'DataDog', + apiKey: 'test' + }, + { + type: 'DataDog', + apiKey: 'test' + } + )); + + schemaValidationUtil.generateSchemaBasicTests( + basicSchemaTestsValidator, + { + type: 'DataDog', + apiKey: 'test', + index: 'index' + }, + [ + { property: 'apiKey', requiredTests: true, stringLengthTests: true } + ] + ); + }); + describe('ElasticSearch', () => { it('should pass minimal declaration', () => validateMinimal( { @@ -4715,6 +4751,109 @@ describe('Declarations', () => { ); }); + describe('Google_Cloud_Logging', () => { + it('should pass minimal declaration', () => validateMinimal( + { + type: 'Google_Cloud_Logging', + logScopeId: 'myProject', + logId: 'allMyLogs', + privateKeyId: 'privateKeyId', + privateKey: { + cipherText: 'privateKey' + }, + serviceEmail: 'serviceEmail' + }, + { + type: 'Google_Cloud_Logging', + logScope: 'projects', + logScopeId: 'myProject', + logId: 'allMyLogs', + privateKeyId: 'privateKeyId', + privateKey: { + class: 'Secret', + protected: 'SecureVault', + cipherText: '$M$privateKey' + }, + serviceEmail: 'serviceEmail', + reportInstanceMetadata: false + } + )); + + it('should allow full declaration', () => validateFull( + { + type: 'Google_Cloud_Logging', + logScope: 'organizations', + logScopeId: 'myOrganization', + logId: 'allMyLogs', + privateKeyId: 'privateKeyId', + privateKey: { + cipherText: 'privateKey' + }, + serviceEmail: 'serviceEmail', + reportInstanceMetadata: true + }, + { + type: 'Google_Cloud_Logging', + logScope: 'organizations', + logScopeId: 'myOrganization', + logId: 'allMyLogs', + privateKeyId: 'privateKeyId', + privateKey: { + class: 'Secret', + protected: 'SecureVault', + cipherText: '$M$privateKey' + }, + serviceEmail: 'serviceEmail', + reportInstanceMetadata: true + } + )); + + it('should restrict allowable characters for logId', () => assert.isRejected(validateFull( + { + type: 'Google_Cloud_Logging', + logScope: 'organizations', + logScopeId: 'myOrganization', + logId: 'allM yLogs', + privateKeyId: 'privateKeyId', + privateKey: { + cipherText: 'privateKey' + }, + serviceEmail: 'serviceEmail', + reportInstanceMetadata: true + } + ), /#\/definitions\/logId\/pattern.*should match pattern.*\^\[a-zA-z0-9._-\]\+\$/)); + + schemaValidationUtil.generateSchemaBasicTests( + basicSchemaTestsValidator, + { + type: 'Google_Cloud_Logging', + logScope: 'organizations', + logScopeId: 'myOrganization', + logId: 'allMyLogs', + privateKeyId: 'privateKeyId', + privateKey: { + cipherText: 'privateKey' + }, + serviceEmail: 'serviceEmail' + }, + [ + { + property: 'logScope', + enumTests: { + allowed: ['projects', 'organizations', 'billingAccounts', 'folders'], + notAllowed: ['', 'what?', 'newlyInvented'] + }, + ignoreOther: true + }, + 'logScopeId', + 'logId', + 'privateKeyId', + 'serviceEmail' + ], + { stringLengthTests: true } + ); + }); + describe('Google_Cloud_Monitoring', () => { it('should pass minimal declaration', () => validateMinimal( { @@ -4735,7 +4874,8 @@ describe('Declarations', () => { protected: 'SecureVault', cipherText: '$M$privateKey' }, - serviceEmail: 'serviceEmail' + serviceEmail: 'serviceEmail', + reportInstanceMetadata: false } )); @@ -4758,7 +4898,8 @@ describe('Declarations', () => { protected: 'SecureVault', cipherText: '$M$privateKey' }, - serviceEmail: 'serviceEmail' + serviceEmail: 'serviceEmail', + reportInstanceMetadata: false } )); @@ -4781,7 +4922,8 @@ describe('Declarations', () => { protected: 'SecureVault', cipherText: '$M$privateKey' }, - serviceEmail: 'serviceEmail' + serviceEmail: 'serviceEmail', + reportInstanceMetadata: false } )); diff --git a/test/unit/eventListener/eventListenerTests.js b/test/unit/eventListener/eventListenerTests.js index 78bbaae9..8cb20b26 100644 --- a/test/unit/eventListener/eventListenerTests.js +++ b/test/unit/eventListener/eventListenerTests.js @@ -121,13 +121,13 @@ describe('Event Listener', () => { .then(() => { const listeners = EventListener.instances; assert.lengthOf(Object.keys(listeners), 1); - assert.deepStrictEqual(gatherIds(), ['Listener1']); - assertListener(listeners.Listener1, { + assert.deepStrictEqual(gatherIds(), ['f5telemetry_default::Listener1']); + assertListener(listeners['f5telemetry_default::Listener1'], { tags: { tenant: '`T`', application: '`A`' } }); testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'INPUT.Telemetry_Listener.Listener1', - 'Telemetry_Listener.Listener1' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener1', + 'Telemetry_Listener.f5telemetry_default::Listener1' ]); assert.lengthOf(EventListener.receiversManager.getAll(), 1); }); @@ -147,7 +147,7 @@ describe('Event Listener', () => { let loggerSpy; beforeEach(() => { - loggerSpy = sinon.spy(EventListener.instances.Listener1.logger, 'exception'); + loggerSpy = sinon.spy(EventListener.instances['f5telemetry_default::Listener1'].logger, 'exception'); }); eventListenerTestData.onMessagesHandler.forEach((testSet) => { testUtil.getCallableIt(testSet)(testSet.name, () => EventListener.receiversManager @@ -155,7 +155,7 @@ describe('Event Listener', () => { .emitAsync('messages', testSet.rawEvents) .then(() => { assert.isTrue(loggerSpy.notCalled); - assert.deepStrictEqual(actualData[EventListener.instances.Listener1.id], testSet.expectedData); + assert.deepStrictEqual(actualData[EventListener.instances['f5telemetry_default::Listener1'].id], testSet.expectedData); })); }); }); @@ -171,34 +171,34 @@ describe('Event Listener', () => { newDecl.Listener3 = { class: 'Telemetry_Listener', match: 'somePattern2', - trace: { type: 'input', path: 'INPUT.listener3' } + trace: { type: 'input', path: 'INPUT.f5telemetry_default::listener3' } }; return configWorker.processDeclaration(testUtil.deepCopy(newDecl)) .then(() => { testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'INPUT.Telemetry_Listener.Listener1', - 'Telemetry_Listener.Listener1', - 'Telemetry_Listener.Listener2', - 'INPUT.listener3' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener1', + 'Telemetry_Listener.f5telemetry_default::Listener1', + 'Telemetry_Listener.f5telemetry_default::Listener2', + 'INPUT.f5telemetry_default::listener3' ]); assert.lengthOf(EventListener.receiversManager.getAll(), 2); - assert.sameDeepMembers(gatherIds(), ['Listener1', 'Listener2', 'Listener3']); + assert.sameDeepMembers(gatherIds(), ['f5telemetry_default::Listener1', 'f5telemetry_default::Listener2', 'f5telemetry_default::Listener3']); const listeners = EventListener.instances; - assertListener(listeners.Listener1, { + assertListener(listeners['f5telemetry_default::Listener1'], { tags: { tenant: '`T`', application: '`A`' } }); - assertListener(listeners.Listener2, { hasFilterFunc: true }); - assertListener(listeners.Listener3, { hasFilterFunc: true }); + assertListener(listeners['f5telemetry_default::Listener2'], { hasFilterFunc: true }); + assertListener(listeners['f5telemetry_default::Listener3'], { hasFilterFunc: true }); return Promise.all([ EventListener.receiversManager.getMessageStream(defaultDeclarationPort).emitAsync('messages', ['virtual_name="somePattern"']), EventListener.receiversManager.getMessageStream(defaultTestPort).emitAsync('messages', ['1234']) ]) .then(() => assert.deepStrictEqual(actualData, { - [listeners.Listener1.id]: [{ data: '1234', telemetryEventCategory: 'event' }], - [listeners.Listener2.id]: [{ virtual_name: 'somePattern', telemetryEventCategory: 'LTM' }] + [listeners['f5telemetry_default::Listener1'].id]: [{ data: '1234', telemetryEventCategory: 'event' }], + [listeners['f5telemetry_default::Listener2'].id]: [{ virtual_name: 'somePattern', telemetryEventCategory: 'LTM' }] })); }); }); @@ -223,10 +223,10 @@ describe('Event Listener', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDecl)) .then(() => { assert.isEmpty(registeredTracerPaths()); - assert.deepStrictEqual(gatherIds(), ['Listener1']); + assert.deepStrictEqual(gatherIds(), ['f5telemetry_default::Listener1']); const listeners = EventListener.instances; - assertListener(listeners.Listener1, { + assertListener(listeners['f5telemetry_default::Listener1'], { tags: { tenant: '`T`', application: '`A`' } }); // one for each protocol @@ -240,7 +240,7 @@ describe('Event Listener', () => { return existingMessageStream.emitAsync('messages', ['6514']) .then(() => assert.deepStrictEqual(actualData, { - [listeners.Listener1.id]: [{ data: '6514', telemetryEventCategory: 'event' }] + [listeners['f5telemetry_default::Listener1'].id]: [{ data: '6514', telemetryEventCategory: 'event' }] })); }); }); @@ -261,15 +261,15 @@ describe('Event Listener', () => { return configWorker.processNamespaceDeclaration(testUtil.deepCopy(newDecl), 'newNamespace') .then(() => { testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'INPUT.Telemetry_Listener.Listener1', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener1', 'INPUT.Telemetry_Listener.newNamespace::Listener1', - 'Telemetry_Listener.Listener1', + 'Telemetry_Listener.f5telemetry_default::Listener1', 'Telemetry_Listener.newNamespace::Listener1' ]); - assert.sameDeepMembers(gatherIds(), ['Listener1', 'newNamespace::Listener1']); + assert.sameDeepMembers(gatherIds(), ['f5telemetry_default::Listener1', 'newNamespace::Listener1']); const listeners = EventListener.instances; - assertListener(listeners.Listener1, { + assertListener(listeners['f5telemetry_default::Listener1'], { tags: { tenant: '`T`', application: '`A`' } }); assertListener(listeners['newNamespace::Listener1'], {}); @@ -306,18 +306,18 @@ describe('Event Listener', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDecl)) .then(() => { testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'INPUT.Telemetry_Listener.Listener1', - 'Telemetry_Listener.Listener1', - 'Telemetry_Listener.New::Listener1' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener1', + 'Telemetry_Listener.New::Listener1', + 'Telemetry_Listener.f5telemetry_default::Listener1' ]); assert.lengthOf(EventListener.getAll(), 2); assert.lengthOf(EventListener.receiversManager.getAll(), 1); - assert.sameDeepMembers(gatherIds(), ['Listener1', 'New::Listener1']); + assert.sameDeepMembers(gatherIds(), ['f5telemetry_default::Listener1', 'New::Listener1']); const listeners = EventListener.instances; return EventListener.receiversManager.getMessageStream(newDecl.Listener1.port).emitAsync('messages', ['6514']) .then(() => assert.deepStrictEqual(actualData, { - [listeners.Listener1.id]: [{ data: '6514', telemetryEventCategory: 'event' }], + [listeners['f5telemetry_default::Listener1'].id]: [{ data: '6514', telemetryEventCategory: 'event' }], [listeners['New::Listener1'].id]: [{ data: '6514', telemetryEventCategory: 'event' }] })); }); @@ -343,13 +343,13 @@ describe('Event Listener', () => { }; return configWorker.processDeclaration(testUtil.deepCopy(newDecl)) .then(() => { - testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_Listener.Listener1']); + testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_Listener.f5telemetry_default::Listener1']); assert.lengthOf(EventListener.getAll(), 1); assert.lengthOf(EventListener.receiversManager.getAll(), 1); - assert.deepStrictEqual(gatherIds(), ['Listener1']); + assert.deepStrictEqual(gatherIds(), ['f5telemetry_default::Listener1']); const listeners = EventListener.instances; - assertListener(listeners.Listener1, { + assertListener(listeners['f5telemetry_default::Listener1'], { tags: { tenant: 'Tenant', application: 'Application' }, hasFilterFunc: true, actions: [{ @@ -363,7 +363,7 @@ describe('Event Listener', () => { return EventListener.receiversManager.getMessageStream(9999).emitAsync('messages', ['virtual_name="test"']) .then(() => assert.deepStrictEqual(actualData, { - [listeners.Listener1.id]: [{ + [listeners['f5telemetry_default::Listener1'].id]: [{ virtual_name: 'test', telemetryEventCategory: 'LTM', tenant: 'Tenant', @@ -383,14 +383,14 @@ describe('Event Listener', () => { assert.lengthOf(EventListener.getAll(), 1); assert.lengthOf(EventListener.receiversManager.getAll(), 1); assert.isEmpty(registeredTracerPaths()); - assert.deepStrictEqual(gatherIds(), ['Listener1']); + assert.deepStrictEqual(gatherIds(), ['f5telemetry_default::Listener1']); const listeners = EventListener.instances; - assertListener(listeners.Listener1, {}); + assertListener(listeners['f5telemetry_default::Listener1'], {}); return EventListener.receiversManager.getMessageStream(defaultDeclarationPort).emitAsync('messages', ['data']) .then(() => assert.deepStrictEqual(actualData, { - [listeners.Listener1.id]: [{ + [listeners['f5telemetry_default::Listener1'].id]: [{ data: 'data', telemetryEventCategory: 'event' }] @@ -471,14 +471,14 @@ describe('Event Listener', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDecl)) .then(() => { testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'INPUT.Telemetry_Listener.Listener1', - 'INPUT.Telemetry_Listener.Listener2', - 'INPUT.Telemetry_Listener.Listener3', - 'INPUT.Telemetry_Listener.Listener4', - 'Telemetry_Listener.Listener1', - 'Telemetry_Listener.Listener2', - 'Telemetry_Listener.Listener3', - 'Telemetry_Listener.Listener4' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener1', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener2', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener3', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener4', + 'Telemetry_Listener.f5telemetry_default::Listener1', + 'Telemetry_Listener.f5telemetry_default::Listener2', + 'Telemetry_Listener.f5telemetry_default::Listener3', + 'Telemetry_Listener.f5telemetry_default::Listener4' ]); return Promise.all([ @@ -500,7 +500,7 @@ describe('Event Listener', () => { }) .then(() => { assert.deepStrictEqual( - getTracerData('INPUT.Telemetry_Listener.Listener1'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener1'), [{ data: Buffer.from('12345').toString('hex'), // in hex hrtime: [0, 0], @@ -510,9 +510,9 @@ describe('Event Listener', () => { }] ); [ - 'INPUT.Telemetry_Listener.Listener2', - 'INPUT.Telemetry_Listener.Listener3', - 'INPUT.Telemetry_Listener.Listener4' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener2', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener3', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener4' ].forEach(tracerPath => assert.deepStrictEqual( getTracerData(tracerPath), [{ @@ -544,7 +544,7 @@ describe('Event Listener', () => { ])) .then(() => { assert.includeDeepMembers( - getTracerData('INPUT.Telemetry_Listener.Listener1'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener1'), [{ data: Buffer.from('6789').toString('hex'), // in hex hrtime: [0, 0], @@ -554,8 +554,8 @@ describe('Event Listener', () => { }] ); [ - 'INPUT.Telemetry_Listener.Listener2', - 'INPUT.Telemetry_Listener.Listener3' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener2', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener3' ].forEach(tracerPath => assert.includeDeepMembers( getTracerData(tracerPath), [{ @@ -567,7 +567,7 @@ describe('Event Listener', () => { }] )); assert.sameDeepMembers( - getTracerData('INPUT.Telemetry_Listener.Listener4'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener4'), [{ data: Buffer.from('12345').toString('hex'), // in hex hrtime: [0, 0], @@ -598,7 +598,7 @@ describe('Event Listener', () => { ])) .then(() => { assert.includeDeepMembers( - getTracerData('INPUT.Telemetry_Listener.Listener1'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener1'), [{ data: Buffer.from('ABC').toString('hex'), // in hex hrtime: [0, 0], @@ -608,7 +608,7 @@ describe('Event Listener', () => { }] ); assert.includeDeepMembers( - getTracerData('INPUT.Telemetry_Listener.Listener2'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener2'), [{ data: Buffer.from('ABC').toString('hex'), // in hex hrtime: [0, 0], @@ -618,7 +618,7 @@ describe('Event Listener', () => { }] ); assert.notDeepInclude( - getTracerData('INPUT.Telemetry_Listener.Listener3'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener3'), { data: Buffer.from('ABC').toString('hex'), // in hex hrtime: [0, 0], @@ -629,7 +629,7 @@ describe('Event Listener', () => { 'should not write raw data to from disabled listener' ); assert.sameDeepMembers( - getTracerData('INPUT.Telemetry_Listener.Listener4'), + getTracerData('INPUT.Telemetry_Listener.f5telemetry_default::Listener4'), [{ data: '3132333435', // in hex hrtime: [0, 0], @@ -660,16 +660,16 @@ describe('Event Listener', () => { }) ])) .then(() => [ - 'INPUT.Telemetry_Listener.Listener1', - 'INPUT.Telemetry_Listener.Listener2', - 'INPUT.Telemetry_Listener.Listener3', - 'INPUT.Telemetry_Listener.Listener4' + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener1', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener2', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener3', + 'INPUT.Telemetry_Listener.f5telemetry_default::Listener4' ].forEach(tracerPath => assert.notDeepInclude( getTracerData(tracerPath), { data: Buffer.from('final').toString('hex'), // in hex hrtime: [0, 0], - protocol: tracerPath.indexOf('Listener1') !== -1 ? 'udp' : 'tcp', + protocol: tracerPath.indexOf('f5telemetry_default::Listener1') !== -1 ? 'udp' : 'tcp', senderKey: 'senderKey', timestamp: 0 }, diff --git a/test/unit/iHealthTests.js b/test/unit/iHealthTests.js index 64f5a12c..af570baf 100644 --- a/test/unit/iHealthTests.js +++ b/test/unit/iHealthTests.js @@ -51,10 +51,10 @@ describe('iHealth', () => { const components = [ dummies.configuration.ihealthPoller.full.encrypted({ name: 'iHealthPoller_1', - id: 'System::iHealthPoller_1', + id: 'f5telemetry_default::System::iHealthPoller_1', namespace: 'f5telemetry_default', systemName: 'System', - traceName: 'System::iHealthPoller_1', + traceName: 'f5telemetry_default::System::iHealthPoller_1', iHealth: { name: 'iHealthPoller_1', credentials: { username: 'test_user_2', passphrase: { cipherText: '$M$test_passphrase_2' } }, @@ -209,7 +209,7 @@ describe('iHealth', () => { declaration.Namespace.DefaultConsumer = dummies.declaration.consumer.default.decrypted(); preExistingConfigIDs = [ 'Namespace::System::iHealthPoller_1', - 'System::iHealthPoller_1' + 'f5telemetry_default::System::iHealthPoller_1' ]; // slow down polling process ihealthStub.ihealthUtil.QkviewManager.process.rejects(new Error('expected error')); @@ -260,7 +260,7 @@ describe('iHealth', () => { .then(() => { restStorageData = coreStub.persistentStorage.savedData; assert.deepStrictEqual(restStorageData.ihealth.nonExistingInstance, undefined, 'should remove data for non-existing instance'); - assert.notDeepEqual(restStorageData.ihealth['System::iHealthPoller_1'], undefined, 'should keep data for existing instance'); + assert.notDeepEqual(restStorageData.ihealth['f5telemetry_default::System::iHealthPoller_1'], undefined, 'should keep data for existing instance'); }); }); @@ -314,8 +314,8 @@ describe('iHealth', () => { }; }), [ - { id: 'System::iHealthPoller_1', demo: true, consumers: ['DefaultConsumer'] }, - { id: 'System::iHealthPoller_1', demo: false, consumers: ['DefaultConsumer'] }, + { id: 'f5telemetry_default::System::iHealthPoller_1', demo: true, consumers: ['f5telemetry_default::DefaultConsumer'] }, + { id: 'f5telemetry_default::System::iHealthPoller_1', demo: false, consumers: ['f5telemetry_default::DefaultConsumer'] }, { id: 'Namespace::System::iHealthPoller_1', demo: true, consumers: ['Namespace::DefaultConsumer'] }, { id: 'Namespace::System::iHealthPoller_1', demo: false, consumers: ['Namespace::DefaultConsumer'] } ], @@ -340,7 +340,7 @@ describe('iHealth', () => { .then(() => { instancesBefore = IHealthPoller.getAll({ includeDemo: true }); // demo ID for default namespace only - configIDsBeforeUpdate = preExistingConfigIDs.concat(['System::iHealthPoller_1']); + configIDsBeforeUpdate = preExistingConfigIDs.concat(['f5telemetry_default::System::iHealthPoller_1']); const namespaceDeclaration = testUtil.deepCopy(declaration.Namespace); // should remove demo instance from namespace return configWorker.processNamespaceDeclaration(namespaceDeclaration, 'Namespace'); @@ -391,8 +391,8 @@ describe('iHealth', () => { }; }), [ - { id: 'System::iHealthPoller_1', demo: true, consumers: ['DefaultConsumer'] }, - { id: 'System::iHealthPoller_1', demo: false, consumers: ['DefaultConsumer'] }, + { id: 'f5telemetry_default::System::iHealthPoller_1', demo: true, consumers: ['f5telemetry_default::DefaultConsumer'] }, + { id: 'f5telemetry_default::System::iHealthPoller_1', demo: false, consumers: ['f5telemetry_default::DefaultConsumer'] }, { id: 'Namespace::System::iHealthPoller_1', demo: false, consumers: ['Namespace::DefaultConsumer'] } ], 'should collect report from running pollers' @@ -577,14 +577,14 @@ describe('iHealth', () => { assert.ownInclude(response, { demoMode: true, disabled: false, - id: 'System::iHealthPoller_1', - name: 'System::iHealthPoller_1 (DEMO)', + id: 'f5telemetry_default::System::iHealthPoller_1', + name: 'f5telemetry_default::System::iHealthPoller_1 (DEMO)', isRunning: false, message: 'iHealth Poller for System "System" started' }); assert.sameMembers( IHealthPoller.getAll({ demoOnly: true }).map(p => p.id), - ['System::iHealthPoller_1'], + ['f5telemetry_default::System::iHealthPoller_1'], 'should create instance with expected ID' ); return ihealth.startPoller('System'); @@ -593,8 +593,8 @@ describe('iHealth', () => { assert.ownInclude(response, { demoMode: true, disabled: false, - id: 'System::iHealthPoller_1', - name: 'System::iHealthPoller_1 (DEMO)', + id: 'f5telemetry_default::System::iHealthPoller_1', + name: 'f5telemetry_default::System::iHealthPoller_1 (DEMO)', isRunning: true, message: 'iHealth Poller for System "System" started already' }); @@ -636,8 +636,8 @@ describe('iHealth', () => { assert.ownInclude(responses[0], { demoMode: true, disabled: false, - id: 'Disabled_System::iHealthPoller_1', - name: 'Disabled_System::iHealthPoller_1 (DEMO)', + id: 'f5telemetry_default::Disabled_System::iHealthPoller_1', + name: 'f5telemetry_default::Disabled_System::iHealthPoller_1 (DEMO)', isRunning: false, message: 'iHealth Poller for System "Disabled_System" started' }); @@ -652,7 +652,7 @@ describe('iHealth', () => { assert.sameMembers( IHealthPoller.getAll({ demoOnly: true }).map(p => p.id), [ - 'Disabled_System::iHealthPoller_1', + 'f5telemetry_default::Disabled_System::iHealthPoller_1', 'Namespace::Disabled_System::iHealthPoller_1' ], 'should create instance with expected ID' @@ -666,8 +666,8 @@ describe('iHealth', () => { assert.ownInclude(responses[0], { demoMode: true, disabled: false, - id: 'Disabled_System::iHealthPoller_1', - name: 'Disabled_System::iHealthPoller_1 (DEMO)', + id: 'f5telemetry_default::Disabled_System::iHealthPoller_1', + name: 'f5telemetry_default::Disabled_System::iHealthPoller_1 (DEMO)', isRunning: true, message: 'iHealth Poller for System "Disabled_System" started already' }); @@ -742,7 +742,7 @@ describe('iHealth', () => { assert.sameDeepMembers( ihealth.getCurrentState().map(s => s.name), [ - 'System::iHealthPoller_1', + 'f5telemetry_default::System::iHealthPoller_1', 'Namespace::System::iHealthPoller_1' ], 'should return all registered pollers' @@ -767,9 +767,9 @@ describe('iHealth', () => { assert.sameDeepMembers( ihealth.getCurrentState().map(s => s.name), [ - 'System::iHealthPoller_1 (DEMO)', + 'f5telemetry_default::System::iHealthPoller_1 (DEMO)', 'Namespace::System::iHealthPoller_1 (DEMO)', - 'System::iHealthPoller_1', + 'f5telemetry_default::System::iHealthPoller_1', 'Namespace::System::iHealthPoller_1' ], 'should return all registered pollers' diff --git a/test/unit/ihealthPollerTests.js b/test/unit/ihealthPollerTests.js index ddcdfceb..6aab3f4d 100644 --- a/test/unit/ihealthPollerTests.js +++ b/test/unit/ihealthPollerTests.js @@ -372,7 +372,7 @@ describe('IHealthPoller', () => { passphrase: { cipherText: 'test_pass_3' } } }); - instanceID = 'System::iHealthPoller_1'; // traceName + instanceID = 'f5telemetry_default::System::iHealthPoller_1'; // traceName instanceName = 'iHealthPoller_1'; // auto-generated name instance = IHealthPoller.create(instanceID, { name: instanceName }); coreStub.utilMisc.generateUuid.numbersOnly = false; @@ -442,9 +442,9 @@ describe('IHealthPoller', () => { instance.getConfig(), dummies.configuration.ihealthPoller.full.encrypted({ name: 'iHealthPoller_1', - id: 'System::iHealthPoller_1', + id: 'f5telemetry_default::System::iHealthPoller_1', trace: true, - traceName: 'System::iHealthPoller_1', + traceName: 'f5telemetry_default::System::iHealthPoller_1', iHealth: { name: 'iHealthPoller_1', credentials: { @@ -491,7 +491,7 @@ describe('IHealthPoller', () => { }, demoMode: false, disabled: false, - id: 'System::iHealthPoller_1', + id: 'f5telemetry_default::System::iHealthPoller_1', name: 'iHealthPoller_1', nextFireDate: 'not set', state: 'uninitialized', @@ -546,7 +546,7 @@ describe('IHealthPoller', () => { reportCollectRetries: 0 }, timeUntilNextExecution: info.timeUntilNextExecution, // not care - id: 'System::iHealthPoller_1', + id: 'f5telemetry_default::System::iHealthPoller_1', name: 'iHealthPoller_1 (DEMO)' }, 'should match expected data'); }); diff --git a/test/unit/pullConsumers/data/prometheusPullConsumerTestsData.js b/test/unit/pullConsumers/data/prometheusPullConsumerTestsData.js index 8a28097d..c8e729d9 100644 --- a/test/unit/pullConsumers/data/prometheusPullConsumerTestsData.js +++ b/test/unit/pullConsumers/data/prometheusPullConsumerTestsData.js @@ -19,49 +19,7 @@ module.exports = { * - The metrics are created as "gauges", allowing for metric values to be set to arbitrary values */ expectedData: { - unfiltered: `# HELP f5_clientside_bitsIn clientside.bitsIn -# TYPE f5_clientside_bitsIn gauge -f5_clientside_bitsIn{virtualServers="/Common/shared"} 5504 -f5_clientside_bitsIn{virtualServers="/Sample_01/A1/serviceMain"} 52896 -f5_clientside_bitsIn{virtualServers="/Sample_02/A1/serviceMain"} 227168 -f5_clientside_bitsIn{virtualServers="/Sample_02/another"} 31504 - -# HELP f5_clientside_bitsOut clientside.bitsOut -# TYPE f5_clientside_bitsOut gauge -f5_clientside_bitsOut{virtualServers="/Common/shared"} 3072 -f5_clientside_bitsOut{virtualServers="/Sample_01/A1/serviceMain"} 32480 -f5_clientside_bitsOut{virtualServers="/Sample_02/A1/serviceMain"} 139360 -f5_clientside_bitsOut{virtualServers="/Sample_02/another"} 17856 - -# HELP f5_clientside_curConns clientside.curConns -# TYPE f5_clientside_curConns gauge -f5_clientside_curConns{virtualServers="/Common/shared"} 0 -f5_clientside_curConns{virtualServers="/Sample_01/A1/serviceMain"} 0 -f5_clientside_curConns{virtualServers="/Sample_02/A1/serviceMain"} 0 -f5_clientside_curConns{virtualServers="/Sample_02/another"} 0 - -# HELP f5_1024_blocks 1024-blocks -# TYPE f5_1024_blocks gauge -f5_1024_blocks{diskStorage="/"} 428150 -f5_1024_blocks{diskStorage="/dev"} 8208412 -f5_1024_blocks{diskStorage="/dev/shm"} 8217452 -f5_1024_blocks{diskStorage="/run"} 8217452 -f5_1024_blocks{diskStorage="/sys/fs/cgroup"} 8217452 -f5_1024_blocks{diskStorage="/usr"} 5186648 -f5_1024_blocks{diskStorage="/shared"} 15350768 -f5_1024_blocks{diskStorage="/shared/rrd.1.2"} 8217452 -f5_1024_blocks{diskStorage="/config"} 2171984 -f5_1024_blocks{diskStorage="/var"} 3030800 -f5_1024_blocks{diskStorage="/var/prompt"} 4096 -f5_1024_blocks{diskStorage="/var/tmstat"} 8217452 -f5_1024_blocks{diskStorage="/var/log"} 2958224 -f5_1024_blocks{diskStorage="/appdata"} 25717852 -f5_1024_blocks{diskStorage="/var/loipc"} 8217452 -f5_1024_blocks{diskStorage="/var/apm/mount/apmclients-7180.2019.119.331-4683.0.iso"} 304366 -f5_1024_blocks{diskStorage="/run/user/91"} 1643492 -f5_1024_blocks{diskStorage="/mnt/sshplugin_tempfs"} 8217452 - -# HELP f5_Capacity_Float Capacity_Float + unfiltered: `# HELP f5_Capacity_Float Capacity_Float # TYPE f5_Capacity_Float gauge f5_Capacity_Float{diskStorage="/"} 0.48 f5_Capacity_Float{diskStorage="/dev"} 0.01 @@ -82,55 +40,6 @@ f5_Capacity_Float{diskStorage="/var/apm/mount/apmclients-7180.2019.119.331-4683. f5_Capacity_Float{diskStorage="/run/user/91"} 0 f5_Capacity_Float{diskStorage="/mnt/sshplugin_tempfs"} 0 -# HELP f5_r_s r/s -# TYPE f5_r_s gauge -f5_r_s{diskLatency="sda"} 1.05 -f5_r_s{diskLatency="dm-0"} 0 -f5_r_s{diskLatency="dm-1"} 0 -f5_r_s{diskLatency="dm-2"} 0.01 -f5_r_s{diskLatency="dm-3"} 0.01 -f5_r_s{diskLatency="dm-4"} 0 -f5_r_s{diskLatency="dm-5"} 0 -f5_r_s{diskLatency="dm-6"} 0.03 -f5_r_s{diskLatency="dm-7"} 0 -f5_r_s{diskLatency="dm-8"} 0.01 - -# HELP f5_w_s w/s -# TYPE f5_w_s gauge -f5_w_s{diskLatency="sda"} 7.41 -f5_w_s{diskLatency="dm-0"} 0 -f5_w_s{diskLatency="dm-1"} 3.16 -f5_w_s{diskLatency="dm-2"} 4.48 -f5_w_s{diskLatency="dm-3"} 2.66 -f5_w_s{diskLatency="dm-4"} 0.01 -f5_w_s{diskLatency="dm-5"} 0.81 -f5_w_s{diskLatency="dm-6"} 0 -f5_w_s{diskLatency="dm-7"} 0.16 -f5_w_s{diskLatency="dm-8"} 3.83 - -# HELP f5__util %util -# TYPE f5__util gauge -f5__util{diskLatency="sda"} 1.36 -f5__util{diskLatency="dm-0"} 0 -f5__util{diskLatency="dm-1"} 0.25 -f5__util{diskLatency="dm-2"} 0.31 -f5__util{diskLatency="dm-3"} 0.24 -f5__util{diskLatency="dm-4"} 0 -f5__util{diskLatency="dm-5"} 0.09 -f5__util{diskLatency="dm-6"} 0 -f5__util{diskLatency="dm-7"} 0.01 -f5__util{diskLatency="dm-8"} 0.31 - -# HELP f5_counters_bitsIn counters.bitsIn -# TYPE f5_counters_bitsIn gauge -f5_counters_bitsIn{networkInterfaces="1.0"} 13619749722248 -f5_counters_bitsIn{networkInterfaces="mgmt"} 28643376254552 - -# HELP f5_counters_bitsOut counters.bitsOut -# TYPE f5_counters_bitsOut gauge -f5_counters_bitsOut{networkInterfaces="1.0"} 9802738696 -f5_counters_bitsOut{networkInterfaces="mgmt"} 12929625080 - # HELP f5_name name # TYPE f5_name gauge f5_name{networkInterfaces="1.0"} 1 @@ -167,54 +76,6 @@ f5_lowestPriogrp{pools="/Sample_01/A1/web_pool1"} 0 f5_lowestPriogrp{pools="/Sample_02/A1/web_pool"} 0 f5_lowestPriogrp{pools="/Sample_02/A1/web_pool1"} 0 -# HELP f5_serverside_bitsIn serverside.bitsIn -# TYPE f5_serverside_bitsIn gauge -f5_serverside_bitsIn{pools="/Common/h.4"} 0 -f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool"} 0 -f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 0 -f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 0 -f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool1"} 0 -f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 0 -f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 0 -f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool"} 0 -f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 0 -f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 0 -f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool1"} 0 -f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 -f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 - -# HELP f5_serverside_bitsOut serverside.bitsOut -# TYPE f5_serverside_bitsOut gauge -f5_serverside_bitsOut{pools="/Common/h.4"} 0 -f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool"} 0 -f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 0 -f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 0 -f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool1"} 0 -f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 0 -f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 0 -f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool"} 0 -f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 0 -f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 0 -f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool1"} 0 -f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 -f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 - -# HELP f5_serverside_curConns serverside.curConns -# TYPE f5_serverside_curConns gauge -f5_serverside_curConns{pools="/Common/h.4"} 0 -f5_serverside_curConns{pools="/Sample_01/A1/web_pool"} 0 -f5_serverside_curConns{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 0 -f5_serverside_curConns{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 0 -f5_serverside_curConns{pools="/Sample_01/A1/web_pool1"} 0 -f5_serverside_curConns{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 0 -f5_serverside_curConns{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 0 -f5_serverside_curConns{pools="/Sample_02/A1/web_pool"} 0 -f5_serverside_curConns{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 0 -f5_serverside_curConns{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 0 -f5_serverside_curConns{pools="/Sample_02/A1/web_pool1"} 0 -f5_serverside_curConns{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 -f5_serverside_curConns{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 - # HELP f5_port port # TYPE f5_port gauge f5_port{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 80 @@ -344,1215 +205,1358 @@ f5_activeHandshakeRejected{serverSslProfiles="/Common/serverssl-insecure-compati f5_activeHandshakeRejected{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 f5_activeHandshakeRejected{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_adhKeyxchg cipherUses.adhKeyxchg -# TYPE f5_cipherUses_adhKeyxchg gauge -f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 - -# HELP f5_cipherUses_aesBulk cipherUses.aesBulk -# TYPE f5_cipherUses_aesBulk gauge -f5_cipherUses_aesBulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_aesBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_aesBulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_aesBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_aesBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_aesBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_aesBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_currentCompatibleConnections currentCompatibleConnections +# TYPE f5_currentCompatibleConnections gauge +f5_currentCompatibleConnections{clientSslProfiles="/Common/clientssl"} 0 +f5_currentCompatibleConnections{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_currentCompatibleConnections{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_currentCompatibleConnections{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_currentCompatibleConnections{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_currentCompatibleConnections{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/serverssl"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_currentCompatibleConnections{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_aesGcmBulk cipherUses.aesGcmBulk -# TYPE f5_cipherUses_aesGcmBulk gauge -f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_currentConnections currentConnections +# TYPE f5_currentConnections gauge +f5_currentConnections{clientSslProfiles="/Common/clientssl"} 0 +f5_currentConnections{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_currentConnections{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_currentConnections{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_currentConnections{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_currentConnections{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_currentConnections{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_currentConnections{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_currentConnections{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_currentConnections{serverSslProfiles="/Common/serverssl"} 0 +f5_currentConnections{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_currentConnections{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_currentConnections{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_camelliaBulk cipherUses.camelliaBulk -# TYPE f5_cipherUses_camelliaBulk gauge -f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_currentNativeConnections currentNativeConnections +# TYPE f5_currentNativeConnections gauge +f5_currentNativeConnections{clientSslProfiles="/Common/clientssl"} 0 +f5_currentNativeConnections{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_currentNativeConnections{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_currentNativeConnections{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_currentNativeConnections{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_currentNativeConnections{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/serverssl"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_currentNativeConnections{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_chacha20Poly1305Bulk cipherUses.chacha20Poly1305Bulk -# TYPE f5_cipherUses_chacha20Poly1305Bulk gauge -f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_currentActiveHandshakes currentActiveHandshakes +# TYPE f5_currentActiveHandshakes gauge +f5_currentActiveHandshakes{clientSslProfiles="/Common/clientssl"} 0 +f5_currentActiveHandshakes{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_currentActiveHandshakes{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_currentActiveHandshakes{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_currentActiveHandshakes{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_currentActiveHandshakes{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/serverssl"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_currentActiveHandshakes{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_desBulk cipherUses.desBulk -# TYPE f5_cipherUses_desBulk gauge -f5_cipherUses_desBulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_desBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_desBulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_desBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_desBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_desBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_desBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_decryptedBytesIn decryptedBytesIn +# TYPE f5_decryptedBytesIn gauge +f5_decryptedBytesIn{clientSslProfiles="/Common/clientssl"} 0 +f5_decryptedBytesIn{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_decryptedBytesIn{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_decryptedBytesIn{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_decryptedBytesIn{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_decryptedBytesIn{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/serverssl"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_decryptedBytesIn{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_dhRsaKeyxchg cipherUses.dhRsaKeyxchg -# TYPE f5_cipherUses_dhRsaKeyxchg gauge -f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_decryptedBytesOut decryptedBytesOut +# TYPE f5_decryptedBytesOut gauge +f5_decryptedBytesOut{clientSslProfiles="/Common/clientssl"} 0 +f5_decryptedBytesOut{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_decryptedBytesOut{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_decryptedBytesOut{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_decryptedBytesOut{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_decryptedBytesOut{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/serverssl"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_decryptedBytesOut{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_dheDssKeyxchg cipherUses.dheDssKeyxchg -# TYPE f5_cipherUses_dheDssKeyxchg gauge -f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_encryptedBytesIn encryptedBytesIn +# TYPE f5_encryptedBytesIn gauge +f5_encryptedBytesIn{clientSslProfiles="/Common/clientssl"} 0 +f5_encryptedBytesIn{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_encryptedBytesIn{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_encryptedBytesIn{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_encryptedBytesIn{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_encryptedBytesIn{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/serverssl"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_encryptedBytesIn{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_ecdhEcdsaKeyxchg cipherUses.ecdhEcdsaKeyxchg -# TYPE f5_cipherUses_ecdhEcdsaKeyxchg gauge -f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_encryptedBytesOut encryptedBytesOut +# TYPE f5_encryptedBytesOut gauge +f5_encryptedBytesOut{clientSslProfiles="/Common/clientssl"} 0 +f5_encryptedBytesOut{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_encryptedBytesOut{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_encryptedBytesOut{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_encryptedBytesOut{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_encryptedBytesOut{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/serverssl"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_encryptedBytesOut{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_ecdhRsaKeyxchg cipherUses.ecdhRsaKeyxchg -# TYPE f5_cipherUses_ecdhRsaKeyxchg gauge -f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_fatalAlerts fatalAlerts +# TYPE f5_fatalAlerts gauge +f5_fatalAlerts{clientSslProfiles="/Common/clientssl"} 0 +f5_fatalAlerts{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_fatalAlerts{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_fatalAlerts{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_fatalAlerts{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_fatalAlerts{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/serverssl"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_fatalAlerts{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_ecdheEcdsaKeyxchg cipherUses.ecdheEcdsaKeyxchg -# TYPE f5_cipherUses_ecdheEcdsaKeyxchg gauge -f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_handshakeFailures handshakeFailures +# TYPE f5_handshakeFailures gauge +f5_handshakeFailures{clientSslProfiles="/Common/clientssl"} 0 +f5_handshakeFailures{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_handshakeFailures{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_handshakeFailures{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_handshakeFailures{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_handshakeFailures{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/serverssl"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_handshakeFailures{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_ecdheRsaKeyxchg cipherUses.ecdheRsaKeyxchg -# TYPE f5_cipherUses_ecdheRsaKeyxchg gauge -f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_peercertInvalid peercertInvalid +# TYPE f5_peercertInvalid gauge +f5_peercertInvalid{clientSslProfiles="/Common/clientssl"} 0 +f5_peercertInvalid{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_peercertInvalid{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_peercertInvalid{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_peercertInvalid{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_peercertInvalid{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/serverssl"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_peercertInvalid{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_edhRsaKeyxchg cipherUses.edhRsaKeyxchg -# TYPE f5_cipherUses_edhRsaKeyxchg gauge -f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_peercertNone peercertNone +# TYPE f5_peercertNone gauge +f5_peercertNone{clientSslProfiles="/Common/clientssl"} 0 +f5_peercertNone{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_peercertNone{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_peercertNone{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_peercertNone{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_peercertNone{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_peercertNone{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_peercertNone{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_peercertNone{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_peercertNone{serverSslProfiles="/Common/serverssl"} 0 +f5_peercertNone{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_peercertNone{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_peercertNone{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_ideaBulk cipherUses.ideaBulk -# TYPE f5_cipherUses_ideaBulk gauge -f5_cipherUses_ideaBulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_ideaBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_ideaBulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_ideaBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_ideaBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_ideaBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_ideaBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_peercertValid peercertValid +# TYPE f5_peercertValid gauge +f5_peercertValid{clientSslProfiles="/Common/clientssl"} 0 +f5_peercertValid{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_peercertValid{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_peercertValid{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_peercertValid{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_peercertValid{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_peercertValid{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_peercertValid{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_peercertValid{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_peercertValid{serverSslProfiles="/Common/serverssl"} 0 +f5_peercertValid{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_peercertValid{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_peercertValid{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_md5Digest cipherUses.md5Digest -# TYPE f5_cipherUses_md5Digest gauge -f5_cipherUses_md5Digest{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_md5Digest{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_md5Digest{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_md5Digest{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_md5Digest{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_md5Digest{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_md5Digest{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_recordsIn recordsIn +# TYPE f5_recordsIn gauge +f5_recordsIn{clientSslProfiles="/Common/clientssl"} 0 +f5_recordsIn{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_recordsIn{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_recordsIn{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_recordsIn{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_recordsIn{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_recordsIn{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_recordsIn{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_recordsIn{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_recordsIn{serverSslProfiles="/Common/serverssl"} 0 +f5_recordsIn{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_recordsIn{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_recordsIn{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_nullBulk cipherUses.nullBulk -# TYPE f5_cipherUses_nullBulk gauge -f5_cipherUses_nullBulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_nullBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_nullBulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_nullBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_nullBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_nullBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_nullBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_recordsOut recordsOut +# TYPE f5_recordsOut gauge +f5_recordsOut{clientSslProfiles="/Common/clientssl"} 0 +f5_recordsOut{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_recordsOut{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_recordsOut{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_recordsOut{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_recordsOut{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_recordsOut{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_recordsOut{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_recordsOut{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_recordsOut{serverSslProfiles="/Common/serverssl"} 0 +f5_recordsOut{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_recordsOut{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_recordsOut{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cipherUses_nullDigest cipherUses.nullDigest -# TYPE f5_cipherUses_nullDigest gauge -f5_cipherUses_nullDigest{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_nullDigest{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_nullDigest{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_nullDigest{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_nullDigest{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_nullDigest{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_nullDigest{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_sniRejects sniRejects +# TYPE f5_sniRejects gauge +f5_sniRejects{clientSslProfiles="/Common/clientssl"} 0 +f5_sniRejects{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_sniRejects{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_sniRejects{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_sniRejects{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_sniRejects{clientSslProfiles="/Common/wom-default-clientssl"} 0 -# HELP f5_cipherUses_rc2Bulk cipherUses.rc2Bulk -# TYPE f5_cipherUses_rc2Bulk gauge -f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_expirationDate expirationDate +# TYPE f5_expirationDate gauge +f5_expirationDate{sslCerts="ca-bundle.crt"} 1893455999 +f5_expirationDate{sslCerts="default.crt"} 1893790681 +f5_expirationDate{sslCerts="f5-ca-bundle.crt"} 1922896554 +f5_expirationDate{sslCerts="f5-irule.crt"} 1815944413 -# HELP f5_cipherUses_rc4Bulk cipherUses.rc4Bulk -# TYPE f5_cipherUses_rc4Bulk gauge -f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_hcInBroadcastPkts hcInBroadcastPkts +# TYPE f5_hcInBroadcastPkts gauge +f5_hcInBroadcastPkts{networkTunnels="/Common/http-tunnel"} 0 +f5_hcInBroadcastPkts{networkTunnels="/Common/socks-tunnel"} 0 -# HELP f5_cipherUses_rsaKeyxchg cipherUses.rsaKeyxchg -# TYPE f5_cipherUses_rsaKeyxchg gauge -f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_hcInMulticastPkts hcInMulticastPkts +# TYPE f5_hcInMulticastPkts gauge +f5_hcInMulticastPkts{networkTunnels="/Common/http-tunnel"} 0 +f5_hcInMulticastPkts{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_hcInOctets hcInOctets +# TYPE f5_hcInOctets gauge +f5_hcInOctets{networkTunnels="/Common/http-tunnel"} 0 +f5_hcInOctets{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_hcInUcastPkts hcInUcastPkts +# TYPE f5_hcInUcastPkts gauge +f5_hcInUcastPkts{networkTunnels="/Common/http-tunnel"} 0 +f5_hcInUcastPkts{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_hcOutBroadcastPkts hcOutBroadcastPkts +# TYPE f5_hcOutBroadcastPkts gauge +f5_hcOutBroadcastPkts{networkTunnels="/Common/http-tunnel"} 0 +f5_hcOutBroadcastPkts{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_hcOutMulticastPkts hcOutMulticastPkts +# TYPE f5_hcOutMulticastPkts gauge +f5_hcOutMulticastPkts{networkTunnels="/Common/http-tunnel"} 0 +f5_hcOutMulticastPkts{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_hcOutOctets hcOutOctets +# TYPE f5_hcOutOctets gauge +f5_hcOutOctets{networkTunnels="/Common/http-tunnel"} 0 +f5_hcOutOctets{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_hcOutUcastPkts hcOutUcastPkts +# TYPE f5_hcOutUcastPkts gauge +f5_hcOutUcastPkts{networkTunnels="/Common/http-tunnel"} 0 +f5_hcOutUcastPkts{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_inDiscards inDiscards +# TYPE f5_inDiscards gauge +f5_inDiscards{networkTunnels="/Common/http-tunnel"} 0 +f5_inDiscards{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_inErrors inErrors +# TYPE f5_inErrors gauge +f5_inErrors{networkTunnels="/Common/http-tunnel"} 0 +f5_inErrors{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_inUnknownProtos inUnknownProtos +# TYPE f5_inUnknownProtos gauge +f5_inUnknownProtos{networkTunnels="/Common/http-tunnel"} 0 +f5_inUnknownProtos{networkTunnels="/Common/socks-tunnel"} 0 + +# HELP f5_outDiscards outDiscards +# TYPE f5_outDiscards gauge +f5_outDiscards{networkTunnels="/Common/http-tunnel"} 0 +f5_outDiscards{networkTunnels="/Common/socks-tunnel"} 0 -# HELP f5_cipherUses_shaDigest cipherUses.shaDigest -# TYPE f5_cipherUses_shaDigest gauge -f5_cipherUses_shaDigest{clientSslProfiles="/Common/clientssl"} 0 -f5_cipherUses_shaDigest{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_cipherUses_shaDigest{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_cipherUses_shaDigest{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_cipherUses_shaDigest{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_cipherUses_shaDigest{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/serverssl"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_cipherUses_shaDigest{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_outErrors outErrors +# TYPE f5_outErrors gauge +f5_outErrors{networkTunnels="/Common/http-tunnel"} 0 +f5_outErrors{networkTunnels="/Common/socks-tunnel"} 0 -# HELP f5_currentCompatibleConnections currentCompatibleConnections -# TYPE f5_currentCompatibleConnections gauge -f5_currentCompatibleConnections{clientSslProfiles="/Common/clientssl"} 0 -f5_currentCompatibleConnections{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_currentCompatibleConnections{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_currentCompatibleConnections{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_currentCompatibleConnections{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_currentCompatibleConnections{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/serverssl"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_currentCompatibleConnections{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_aborts aborts +# TYPE f5_aborts gauge +f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 0 +f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 0 +f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 +f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 0 +f5_aborts{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 0 +f5_aborts{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 0 +f5_aborts{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 0 +f5_aborts{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 +f5_aborts{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 +f5_aborts{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 +f5_aborts{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 +f5_aborts{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 +f5_aborts{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 +f5_aborts{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 +f5_aborts{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 -# HELP f5_currentConnections currentConnections -# TYPE f5_currentConnections gauge -f5_currentConnections{clientSslProfiles="/Common/clientssl"} 0 -f5_currentConnections{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_currentConnections{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_currentConnections{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_currentConnections{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_currentConnections{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_currentConnections{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_currentConnections{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_currentConnections{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_currentConnections{serverSslProfiles="/Common/serverssl"} 0 -f5_currentConnections{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_currentConnections{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_currentConnections{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_avgCycles avgCycles +# TYPE f5_avgCycles gauge +f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 40577 +f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 40467 +f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 +f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 53953 +f5_avgCycles{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 31414 +f5_avgCycles{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 5154 +f5_avgCycles{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 51596 +f5_avgCycles{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 +f5_avgCycles{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 +f5_avgCycles{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 +f5_avgCycles{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 +f5_avgCycles{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 +f5_avgCycles{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 +f5_avgCycles{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 +f5_avgCycles{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 -# HELP f5_currentNativeConnections currentNativeConnections -# TYPE f5_currentNativeConnections gauge -f5_currentNativeConnections{clientSslProfiles="/Common/clientssl"} 0 -f5_currentNativeConnections{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_currentNativeConnections{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_currentNativeConnections{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_currentNativeConnections{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_currentNativeConnections{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/serverssl"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_currentNativeConnections{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_failures failures +# TYPE f5_failures gauge +f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 0 +f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 0 +f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 +f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 0 +f5_failures{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 0 +f5_failures{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 0 +f5_failures{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 0 +f5_failures{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 +f5_failures{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 +f5_failures{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 +f5_failures{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 +f5_failures{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 +f5_failures{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 +f5_failures{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 +f5_failures{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 -# HELP f5_currentActiveHandshakes currentActiveHandshakes -# TYPE f5_currentActiveHandshakes gauge -f5_currentActiveHandshakes{clientSslProfiles="/Common/clientssl"} 0 -f5_currentActiveHandshakes{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_currentActiveHandshakes{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_currentActiveHandshakes{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_currentActiveHandshakes{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_currentActiveHandshakes{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/serverssl"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_currentActiveHandshakes{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_maxCycles maxCycles +# TYPE f5_maxCycles gauge +f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 40577 +f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 40467 +f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 +f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 53953 +f5_maxCycles{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 31414 +f5_maxCycles{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 5154 +f5_maxCycles{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 51596 +f5_maxCycles{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 +f5_maxCycles{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 +f5_maxCycles{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 +f5_maxCycles{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 +f5_maxCycles{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 +f5_maxCycles{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 +f5_maxCycles{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 +f5_maxCycles{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 -# HELP f5_decryptedBytesIn decryptedBytesIn -# TYPE f5_decryptedBytesIn gauge -f5_decryptedBytesIn{clientSslProfiles="/Common/clientssl"} 0 -f5_decryptedBytesIn{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_decryptedBytesIn{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_decryptedBytesIn{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_decryptedBytesIn{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_decryptedBytesIn{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/serverssl"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_decryptedBytesIn{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_minCycles minCycles +# TYPE f5_minCycles gauge +f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 11518 +f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 36591 +f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 +f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 32254 +f5_minCycles{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 14959 +f5_minCycles{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 2640 +f5_minCycles{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 11006 +f5_minCycles{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 +f5_minCycles{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 +f5_minCycles{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 +f5_minCycles{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 +f5_minCycles{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 +f5_minCycles{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 +f5_minCycles{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 +f5_minCycles{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 -# HELP f5_decryptedBytesOut decryptedBytesOut -# TYPE f5_decryptedBytesOut gauge -f5_decryptedBytesOut{clientSslProfiles="/Common/clientssl"} 0 -f5_decryptedBytesOut{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_decryptedBytesOut{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_decryptedBytesOut{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_decryptedBytesOut{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_decryptedBytesOut{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/serverssl"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_decryptedBytesOut{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_priority priority +# TYPE f5_priority gauge +f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 500 +f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 500 +f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 500 +f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 500 +f5_priority{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 500 +f5_priority{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 500 +f5_priority{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 500 +f5_priority{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 500 +f5_priority{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 500 +f5_priority{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 500 +f5_priority{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 500 +f5_priority{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 500 +f5_priority{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 500 +f5_priority{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 500 +f5_priority{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 500 -# HELP f5_encryptedBytesIn encryptedBytesIn -# TYPE f5_encryptedBytesIn gauge -f5_encryptedBytesIn{clientSslProfiles="/Common/clientssl"} 0 -f5_encryptedBytesIn{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_encryptedBytesIn{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_encryptedBytesIn{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_encryptedBytesIn{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_encryptedBytesIn{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/serverssl"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_encryptedBytesIn{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_totalExecutions totalExecutions +# TYPE f5_totalExecutions gauge +f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 4 +f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 4 +f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 +f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 4 +f5_totalExecutions{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 4 +f5_totalExecutions{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 4 +f5_totalExecutions{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 4 +f5_totalExecutions{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 +f5_totalExecutions{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 +f5_totalExecutions{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 +f5_totalExecutions{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 +f5_totalExecutions{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 +f5_totalExecutions{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 +f5_totalExecutions{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 +f5_totalExecutions{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 + +# HELP f5_alternate alternate +# TYPE f5_alternate gauge +f5_alternate{aPools="/Common/aPool"} 0 +f5_alternate{aaaaPools="/Common/aaaPool"} 0 +f5_alternate{cnamePools="/Common/cnamePool"} 0 +f5_alternate{mxPools="/Common/mxPool"} 0 +f5_alternate{naptrPools="/Common/NPool"} 0 +f5_alternate{srvPools="/Common/srvPool"} 0 +f5_alternate{aWideIps="/Common/awideip.example.com"} 0 +f5_alternate{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_alternate{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_alternate{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_alternate{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_encryptedBytesOut encryptedBytesOut -# TYPE f5_encryptedBytesOut gauge -f5_encryptedBytesOut{clientSslProfiles="/Common/clientssl"} 0 -f5_encryptedBytesOut{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_encryptedBytesOut{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_encryptedBytesOut{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_encryptedBytesOut{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_encryptedBytesOut{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/serverssl"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_encryptedBytesOut{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_dropped dropped +# TYPE f5_dropped gauge +f5_dropped{aPools="/Common/aPool"} 0 +f5_dropped{aaaaPools="/Common/aaaPool"} 0 +f5_dropped{cnamePools="/Common/cnamePool"} 0 +f5_dropped{mxPools="/Common/mxPool"} 0 +f5_dropped{naptrPools="/Common/NPool"} 0 +f5_dropped{srvPools="/Common/srvPool"} 0 +f5_dropped{aWideIps="/Common/awideip.example.com"} 0 +f5_dropped{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_dropped{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_dropped{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_dropped{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_fatalAlerts fatalAlerts -# TYPE f5_fatalAlerts gauge -f5_fatalAlerts{clientSslProfiles="/Common/clientssl"} 0 -f5_fatalAlerts{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_fatalAlerts{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_fatalAlerts{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_fatalAlerts{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_fatalAlerts{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/serverssl"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_fatalAlerts{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_fallback fallback +# TYPE f5_fallback gauge +f5_fallback{aPools="/Common/aPool"} 0 +f5_fallback{aaaaPools="/Common/aaaPool"} 0 +f5_fallback{cnamePools="/Common/cnamePool"} 0 +f5_fallback{mxPools="/Common/mxPool"} 0 +f5_fallback{naptrPools="/Common/NPool"} 0 +f5_fallback{srvPools="/Common/srvPool"} 0 +f5_fallback{aWideIps="/Common/awideip.example.com"} 0 +f5_fallback{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_fallback{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_fallback{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_fallback{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_handshakeFailures handshakeFailures -# TYPE f5_handshakeFailures gauge -f5_handshakeFailures{clientSslProfiles="/Common/clientssl"} 0 -f5_handshakeFailures{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_handshakeFailures{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_handshakeFailures{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_handshakeFailures{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_handshakeFailures{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/serverssl"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_handshakeFailures{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_preferred preferred +# TYPE f5_preferred gauge +f5_preferred{aPools="/Common/aPool"} 0 +f5_preferred{aaaaPools="/Common/aaaPool"} 0 +f5_preferred{cnamePools="/Common/cnamePool"} 0 +f5_preferred{mxPools="/Common/mxPool"} 0 +f5_preferred{naptrPools="/Common/NPool"} 0 +f5_preferred{srvPools="/Common/srvPool"} 0 +f5_preferred{aWideIps="/Common/awideip.example.com"} 0 +f5_preferred{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_preferred{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_preferred{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_preferred{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_peercertInvalid peercertInvalid -# TYPE f5_peercertInvalid gauge -f5_peercertInvalid{clientSslProfiles="/Common/clientssl"} 0 -f5_peercertInvalid{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_peercertInvalid{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_peercertInvalid{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_peercertInvalid{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_peercertInvalid{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/serverssl"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_peercertInvalid{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_returnFromDns returnFromDns +# TYPE f5_returnFromDns gauge +f5_returnFromDns{aPools="/Common/aPool"} 0 +f5_returnFromDns{aaaaPools="/Common/aaaPool"} 0 +f5_returnFromDns{cnamePools="/Common/cnamePool"} 0 +f5_returnFromDns{mxPools="/Common/mxPool"} 0 +f5_returnFromDns{naptrPools="/Common/NPool"} 0 +f5_returnFromDns{srvPools="/Common/srvPool"} 0 +f5_returnFromDns{aWideIps="/Common/awideip.example.com"} 0 +f5_returnFromDns{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_returnFromDns{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_returnFromDns{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_returnFromDns{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_peercertNone peercertNone -# TYPE f5_peercertNone gauge -f5_peercertNone{clientSslProfiles="/Common/clientssl"} 0 -f5_peercertNone{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_peercertNone{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_peercertNone{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_peercertNone{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_peercertNone{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_peercertNone{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_peercertNone{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_peercertNone{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_peercertNone{serverSslProfiles="/Common/serverssl"} 0 -f5_peercertNone{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_peercertNone{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_peercertNone{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_returnToDns returnToDns +# TYPE f5_returnToDns gauge +f5_returnToDns{aPools="/Common/aPool"} 0 +f5_returnToDns{aaaaPools="/Common/aaaPool"} 0 +f5_returnToDns{cnamePools="/Common/cnamePool"} 0 +f5_returnToDns{mxPools="/Common/mxPool"} 0 +f5_returnToDns{naptrPools="/Common/NPool"} 0 +f5_returnToDns{srvPools="/Common/srvPool"} 0 +f5_returnToDns{aWideIps="/Common/awideip.example.com"} 0 +f5_returnToDns{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_returnToDns{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_returnToDns{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_returnToDns{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_peercertValid peercertValid -# TYPE f5_peercertValid gauge -f5_peercertValid{clientSslProfiles="/Common/clientssl"} 0 -f5_peercertValid{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_peercertValid{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_peercertValid{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_peercertValid{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_peercertValid{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_peercertValid{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_peercertValid{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_peercertValid{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_peercertValid{serverSslProfiles="/Common/serverssl"} 0 -f5_peercertValid{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_peercertValid{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_peercertValid{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_enabled enabled +# TYPE f5_enabled gauge +f5_enabled{aPools="/Common/aPool"} 1 +f5_enabled{aaaaPools="/Common/aaaPool"} 1 +f5_enabled{cnamePools="/Common/cnamePool"} 1 +f5_enabled{mxPools="/Common/mxPool"} 1 +f5_enabled{naptrPools="/Common/NPool"} 1 +f5_enabled{srvPools="/Common/srvPool"} 1 +f5_enabled{aWideIps="/Common/awideip.example.com"} 1 +f5_enabled{aaaaWideIps="/Common/aaawideip.example.com"} 1 +f5_enabled{cnameWideIps="/Common/cnamewideip.example.com"} 1 +f5_enabled{mxWideIps="/Common/mxwideip.example.com"} 1 +f5_enabled{srvWideIps="/Common/srvwideip.example.com"} 1 -# HELP f5_protocolUses_dtlsv1 protocolUses.dtlsv1 -# TYPE f5_protocolUses_dtlsv1 gauge -f5_protocolUses_dtlsv1{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_dtlsv1{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_dtlsv1{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_dtlsv1{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_dtlsv1{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_dtlsv1{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_dtlsv1{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_limitMaxBps limitMaxBps +# TYPE f5_limitMaxBps gauge +f5_limitMaxBps{aPools="/Common/aPool"} 0 +f5_limitMaxBps{aaaaPools="/Common/aaaPool"} 0 -# HELP f5_protocolUses_sslv2 protocolUses.sslv2 -# TYPE f5_protocolUses_sslv2 gauge -f5_protocolUses_sslv2{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_sslv2{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_sslv2{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_sslv2{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_sslv2{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_sslv2{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_sslv2{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_limitMaxConnections limitMaxConnections +# TYPE f5_limitMaxConnections gauge +f5_limitMaxConnections{aPools="/Common/aPool"} 0 +f5_limitMaxConnections{aaaaPools="/Common/aaaPool"} 0 -# HELP f5_protocolUses_sslv3 protocolUses.sslv3 -# TYPE f5_protocolUses_sslv3 gauge -f5_protocolUses_sslv3{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_sslv3{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_sslv3{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_sslv3{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_sslv3{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_sslv3{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_sslv3{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_limitMaxPps limitMaxPps +# TYPE f5_limitMaxPps gauge +f5_limitMaxPps{aPools="/Common/aPool"} 0 +f5_limitMaxPps{aaaaPools="/Common/aaaPool"} 0 -# HELP f5_protocolUses_tlsv1 protocolUses.tlsv1 -# TYPE f5_protocolUses_tlsv1 gauge -f5_protocolUses_tlsv1{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_tlsv1{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_tlsv1{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_tlsv1{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_tlsv1{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_tlsv1{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_maxAnswersReturned maxAnswersReturned +# TYPE f5_maxAnswersReturned gauge +f5_maxAnswersReturned{aPools="/Common/aPool"} 1 +f5_maxAnswersReturned{aaaaPools="/Common/aaaPool"} 1 +f5_maxAnswersReturned{mxPools="/Common/mxPool"} 1 +f5_maxAnswersReturned{naptrPools="/Common/NPool"} 1 +f5_maxAnswersReturned{srvPools="/Common/srvPool"} 1 + +# HELP f5_qosHitRatio qosHitRatio +# TYPE f5_qosHitRatio gauge +f5_qosHitRatio{aPools="/Common/aPool"} 5 +f5_qosHitRatio{aaaaPools="/Common/aaaPool"} 5 +f5_qosHitRatio{cnamePools="/Common/cnamePool"} 5 +f5_qosHitRatio{mxPools="/Common/mxPool"} 5 +f5_qosHitRatio{naptrPools="/Common/NPool"} 5 +f5_qosHitRatio{srvPools="/Common/srvPool"} 5 -# HELP f5_protocolUses_tlsv1_1 protocolUses.tlsv1_1 -# TYPE f5_protocolUses_tlsv1_1 gauge -f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_qosHops qosHops +# TYPE f5_qosHops gauge +f5_qosHops{aPools="/Common/aPool"} 0 +f5_qosHops{aaaaPools="/Common/aaaPool"} 0 +f5_qosHops{cnamePools="/Common/cnamePool"} 0 +f5_qosHops{mxPools="/Common/mxPool"} 0 +f5_qosHops{naptrPools="/Common/NPool"} 0 +f5_qosHops{srvPools="/Common/srvPool"} 0 -# HELP f5_protocolUses_tlsv1_2 protocolUses.tlsv1_2 -# TYPE f5_protocolUses_tlsv1_2 gauge -f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_qosKilobytesSecond qosKilobytesSecond +# TYPE f5_qosKilobytesSecond gauge +f5_qosKilobytesSecond{aPools="/Common/aPool"} 3 +f5_qosKilobytesSecond{aaaaPools="/Common/aaaPool"} 3 +f5_qosKilobytesSecond{cnamePools="/Common/cnamePool"} 3 +f5_qosKilobytesSecond{mxPools="/Common/mxPool"} 3 +f5_qosKilobytesSecond{naptrPools="/Common/NPool"} 3 +f5_qosKilobytesSecond{srvPools="/Common/srvPool"} 3 -# HELP f5_protocolUses_tlsv1_3 protocolUses.tlsv1_3 -# TYPE f5_protocolUses_tlsv1_3 gauge -f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/clientssl"} 0 -f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/serverssl"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_qosLcs qosLcs +# TYPE f5_qosLcs gauge +f5_qosLcs{aPools="/Common/aPool"} 30 +f5_qosLcs{aaaaPools="/Common/aaaPool"} 30 +f5_qosLcs{cnamePools="/Common/cnamePool"} 30 +f5_qosLcs{mxPools="/Common/mxPool"} 30 +f5_qosLcs{naptrPools="/Common/NPool"} 30 +f5_qosLcs{srvPools="/Common/srvPool"} 30 -# HELP f5_recordsIn recordsIn -# TYPE f5_recordsIn gauge -f5_recordsIn{clientSslProfiles="/Common/clientssl"} 0 -f5_recordsIn{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_recordsIn{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_recordsIn{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_recordsIn{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_recordsIn{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_recordsIn{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_recordsIn{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_recordsIn{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_recordsIn{serverSslProfiles="/Common/serverssl"} 0 -f5_recordsIn{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_recordsIn{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_recordsIn{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_qosPacketRate qosPacketRate +# TYPE f5_qosPacketRate gauge +f5_qosPacketRate{aPools="/Common/aPool"} 1 +f5_qosPacketRate{aaaaPools="/Common/aaaPool"} 1 +f5_qosPacketRate{cnamePools="/Common/cnamePool"} 1 +f5_qosPacketRate{mxPools="/Common/mxPool"} 1 +f5_qosPacketRate{naptrPools="/Common/NPool"} 1 +f5_qosPacketRate{srvPools="/Common/srvPool"} 1 -# HELP f5_recordsOut recordsOut -# TYPE f5_recordsOut gauge -f5_recordsOut{clientSslProfiles="/Common/clientssl"} 0 -f5_recordsOut{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_recordsOut{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_recordsOut{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_recordsOut{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_recordsOut{clientSslProfiles="/Common/wom-default-clientssl"} 0 -f5_recordsOut{serverSslProfiles="/Common/apm-default-serverssl"} 0 -f5_recordsOut{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 -f5_recordsOut{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 -f5_recordsOut{serverSslProfiles="/Common/serverssl"} 0 -f5_recordsOut{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 -f5_recordsOut{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 -f5_recordsOut{serverSslProfiles="/Common/wom-default-serverssl"} 0 +# HELP f5_qosRtt qosRtt +# TYPE f5_qosRtt gauge +f5_qosRtt{aPools="/Common/aPool"} 50 +f5_qosRtt{aaaaPools="/Common/aaaPool"} 50 +f5_qosRtt{cnamePools="/Common/cnamePool"} 50 +f5_qosRtt{mxPools="/Common/mxPool"} 50 +f5_qosRtt{naptrPools="/Common/NPool"} 50 +f5_qosRtt{srvPools="/Common/srvPool"} 50 -# HELP f5_sniRejects sniRejects -# TYPE f5_sniRejects gauge -f5_sniRejects{clientSslProfiles="/Common/clientssl"} 0 -f5_sniRejects{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 -f5_sniRejects{clientSslProfiles="/Common/clientssl-secure"} 0 -f5_sniRejects{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 -f5_sniRejects{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 -f5_sniRejects{clientSslProfiles="/Common/wom-default-clientssl"} 0 +# HELP f5_qosTopology qosTopology +# TYPE f5_qosTopology gauge +f5_qosTopology{aPools="/Common/aPool"} 0 +f5_qosTopology{aaaaPools="/Common/aaaPool"} 0 +f5_qosTopology{cnamePools="/Common/cnamePool"} 0 +f5_qosTopology{mxPools="/Common/mxPool"} 0 +f5_qosTopology{naptrPools="/Common/NPool"} 0 +f5_qosTopology{srvPools="/Common/srvPool"} 0 -# HELP f5_expirationDate expirationDate -# TYPE f5_expirationDate gauge -f5_expirationDate{sslCerts="ca-bundle.crt"} 1893455999 -f5_expirationDate{sslCerts="default.crt"} 1893790681 -f5_expirationDate{sslCerts="f5-ca-bundle.crt"} 1922896554 -f5_expirationDate{sslCerts="f5-irule.crt"} 1815944413 +# HELP f5_qosVsCapacity qosVsCapacity +# TYPE f5_qosVsCapacity gauge +f5_qosVsCapacity{aPools="/Common/aPool"} 0 +f5_qosVsCapacity{aaaaPools="/Common/aaaPool"} 0 +f5_qosVsCapacity{cnamePools="/Common/cnamePool"} 0 +f5_qosVsCapacity{mxPools="/Common/mxPool"} 0 +f5_qosVsCapacity{naptrPools="/Common/NPool"} 0 +f5_qosVsCapacity{srvPools="/Common/srvPool"} 0 -# HELP f5_hcInBroadcastPkts hcInBroadcastPkts -# TYPE f5_hcInBroadcastPkts gauge -f5_hcInBroadcastPkts{networkTunnels="/Common/http-tunnel"} 0 -f5_hcInBroadcastPkts{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_qosVsScore qosVsScore +# TYPE f5_qosVsScore gauge +f5_qosVsScore{aPools="/Common/aPool"} 0 +f5_qosVsScore{aaaaPools="/Common/aaaPool"} 0 +f5_qosVsScore{cnamePools="/Common/cnamePool"} 0 +f5_qosVsScore{mxPools="/Common/mxPool"} 0 +f5_qosVsScore{naptrPools="/Common/NPool"} 0 +f5_qosVsScore{srvPools="/Common/srvPool"} 0 -# HELP f5_hcInMulticastPkts hcInMulticastPkts -# TYPE f5_hcInMulticastPkts gauge -f5_hcInMulticastPkts{networkTunnels="/Common/http-tunnel"} 0 -f5_hcInMulticastPkts{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_ttl ttl +# TYPE f5_ttl gauge +f5_ttl{aPools="/Common/aPool"} 30 +f5_ttl{aaaaPools="/Common/aaaPool"} 30 +f5_ttl{cnamePools="/Common/cnamePool"} 30 +f5_ttl{mxPools="/Common/mxPool"} 30 +f5_ttl{naptrPools="/Common/NPool"} 30 +f5_ttl{srvPools="/Common/srvPool"} 30 -# HELP f5_hcInOctets hcInOctets -# TYPE f5_hcInOctets gauge -f5_hcInOctets{networkTunnels="/Common/http-tunnel"} 0 -f5_hcInOctets{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_cnameResolutions cnameResolutions +# TYPE f5_cnameResolutions gauge +f5_cnameResolutions{aWideIps="/Common/awideip.example.com"} 0 +f5_cnameResolutions{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_cnameResolutions{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_cnameResolutions{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_cnameResolutions{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_hcInUcastPkts hcInUcastPkts -# TYPE f5_hcInUcastPkts gauge -f5_hcInUcastPkts{networkTunnels="/Common/http-tunnel"} 0 -f5_hcInUcastPkts{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_persisted persisted +# TYPE f5_persisted gauge +f5_persisted{aWideIps="/Common/awideip.example.com"} 0 +f5_persisted{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_persisted{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_persisted{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_persisted{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_hcOutBroadcastPkts hcOutBroadcastPkts -# TYPE f5_hcOutBroadcastPkts gauge -f5_hcOutBroadcastPkts{networkTunnels="/Common/http-tunnel"} 0 -f5_hcOutBroadcastPkts{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_rcode rcode +# TYPE f5_rcode gauge +f5_rcode{aWideIps="/Common/awideip.example.com"} 0 +f5_rcode{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_rcode{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_rcode{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_rcode{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_hcOutMulticastPkts hcOutMulticastPkts -# TYPE f5_hcOutMulticastPkts gauge -f5_hcOutMulticastPkts{networkTunnels="/Common/http-tunnel"} 0 -f5_hcOutMulticastPkts{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_requests requests +# TYPE f5_requests gauge +f5_requests{aWideIps="/Common/awideip.example.com"} 0 +f5_requests{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_requests{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_requests{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_requests{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_hcOutOctets hcOutOctets -# TYPE f5_hcOutOctets gauge -f5_hcOutOctets{networkTunnels="/Common/http-tunnel"} 0 -f5_hcOutOctets{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_resolutions resolutions +# TYPE f5_resolutions gauge +f5_resolutions{aWideIps="/Common/awideip.example.com"} 0 +f5_resolutions{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_resolutions{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_resolutions{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_resolutions{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_hcOutUcastPkts hcOutUcastPkts -# TYPE f5_hcOutUcastPkts gauge -f5_hcOutUcastPkts{networkTunnels="/Common/http-tunnel"} 0 -f5_hcOutUcastPkts{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_failureRcodeTtl failureRcodeTtl +# TYPE f5_failureRcodeTtl gauge +f5_failureRcodeTtl{aWideIps="/Common/awideip.example.com"} 0 +f5_failureRcodeTtl{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_failureRcodeTtl{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_failureRcodeTtl{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_failureRcodeTtl{srvWideIps="/Common/srvwideip.example.com"} 0 -# HELP f5_inDiscards inDiscards -# TYPE f5_inDiscards gauge -f5_inDiscards{networkTunnels="/Common/http-tunnel"} 0 -f5_inDiscards{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_lastResortPool lastResortPool +# TYPE f5_lastResortPool gauge +f5_lastResortPool{aWideIps="/Common/awideip.example.com"} 0 +f5_lastResortPool{aaaaWideIps="/Common/aaawideip.example.com"} 0 +f5_lastResortPool{cnameWideIps="/Common/cnamewideip.example.com"} 0 +f5_lastResortPool{mxWideIps="/Common/mxwideip.example.com"} 0 +f5_lastResortPool{srvWideIps="/Common/srvwideip.example.com"} 0 + +# HELP f5_persistCidrIpv4 persistCidrIpv4 +# TYPE f5_persistCidrIpv4 gauge +f5_persistCidrIpv4{aWideIps="/Common/awideip.example.com"} 32 +f5_persistCidrIpv4{aaaaWideIps="/Common/aaawideip.example.com"} 32 +f5_persistCidrIpv4{cnameWideIps="/Common/cnamewideip.example.com"} 32 +f5_persistCidrIpv4{mxWideIps="/Common/mxwideip.example.com"} 32 +f5_persistCidrIpv4{srvWideIps="/Common/srvwideip.example.com"} 32 -# HELP f5_inErrors inErrors -# TYPE f5_inErrors gauge -f5_inErrors{networkTunnels="/Common/http-tunnel"} 0 -f5_inErrors{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_persistCidrIpv6 persistCidrIpv6 +# TYPE f5_persistCidrIpv6 gauge +f5_persistCidrIpv6{aWideIps="/Common/awideip.example.com"} 128 +f5_persistCidrIpv6{aaaaWideIps="/Common/aaawideip.example.com"} 128 +f5_persistCidrIpv6{cnameWideIps="/Common/cnamewideip.example.com"} 128 +f5_persistCidrIpv6{mxWideIps="/Common/mxwideip.example.com"} 128 +f5_persistCidrIpv6{srvWideIps="/Common/srvwideip.example.com"} 128 -# HELP f5_inUnknownProtos inUnknownProtos -# TYPE f5_inUnknownProtos gauge -f5_inUnknownProtos{networkTunnels="/Common/http-tunnel"} 0 -f5_inUnknownProtos{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_ttlPersistence ttlPersistence +# TYPE f5_ttlPersistence gauge +f5_ttlPersistence{aWideIps="/Common/awideip.example.com"} 3600 +f5_ttlPersistence{aaaaWideIps="/Common/aaawideip.example.com"} 3600 +f5_ttlPersistence{cnameWideIps="/Common/cnamewideip.example.com"} 3600 +f5_ttlPersistence{mxWideIps="/Common/mxwideip.example.com"} 3600 +f5_ttlPersistence{srvWideIps="/Common/srvwideip.example.com"} 3600 -# HELP f5_outDiscards outDiscards -# TYPE f5_outDiscards gauge -f5_outDiscards{networkTunnels="/Common/http-tunnel"} 0 -f5_outDiscards{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_system_configSyncSucceeded system_configSyncSucceeded +# TYPE f5_system_configSyncSucceeded gauge +f5_system_configSyncSucceeded 1 -# HELP f5_outErrors outErrors -# TYPE f5_outErrors gauge -f5_outErrors{networkTunnels="/Common/http-tunnel"} 0 -f5_outErrors{networkTunnels="/Common/socks-tunnel"} 0 +# HELP f5_system_syncSummary system_syncSummary +# TYPE f5_system_syncSummary gauge +f5_system_syncSummary 0 -# HELP f5_aborts aborts -# TYPE f5_aborts gauge -f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 0 -f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 0 -f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 -f5_aborts{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 0 -f5_aborts{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 0 -f5_aborts{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 0 -f5_aborts{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 0 -f5_aborts{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 -f5_aborts{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 -f5_aborts{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 -f5_aborts{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 -f5_aborts{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 -f5_aborts{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 -f5_aborts{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 -f5_aborts{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 +# HELP f5_system_cpu system_cpu +# TYPE f5_system_cpu gauge +f5_system_cpu 7 -# HELP f5_avgCycles avgCycles -# TYPE f5_avgCycles gauge -f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 40577 -f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 40467 -f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 -f5_avgCycles{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 53953 -f5_avgCycles{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 31414 -f5_avgCycles{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 5154 -f5_avgCycles{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 51596 -f5_avgCycles{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 -f5_avgCycles{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 -f5_avgCycles{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 -f5_avgCycles{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 -f5_avgCycles{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 -f5_avgCycles{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 -f5_avgCycles{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 -f5_avgCycles{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 +# HELP f5_system_memory system_memory +# TYPE f5_system_memory gauge +f5_system_memory 57 -# HELP f5_failures failures -# TYPE f5_failures gauge -f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 0 -f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 0 -f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 -f5_failures{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 0 -f5_failures{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 0 -f5_failures{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 0 -f5_failures{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 0 -f5_failures{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 -f5_failures{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 -f5_failures{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 -f5_failures{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 -f5_failures{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 -f5_failures{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 -f5_failures{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 -f5_failures{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 +# HELP f5_system_tmmCpu system_tmmCpu +# TYPE f5_system_tmmCpu gauge +f5_system_tmmCpu 3 -# HELP f5_maxCycles maxCycles -# TYPE f5_maxCycles gauge -f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 40577 -f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 40467 -f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 -f5_maxCycles{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 53953 -f5_maxCycles{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 31414 -f5_maxCycles{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 5154 -f5_maxCycles{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 51596 -f5_maxCycles{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 -f5_maxCycles{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 -f5_maxCycles{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 -f5_maxCycles{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 -f5_maxCycles{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 -f5_maxCycles{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 -f5_maxCycles{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 -f5_maxCycles{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 +# HELP f5_system_tmmMemory system_tmmMemory +# TYPE f5_system_tmmMemory gauge +f5_system_tmmMemory 17 -# HELP f5_minCycles minCycles -# TYPE f5_minCycles gauge -f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 11518 -f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 36591 -f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 -f5_minCycles{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 32254 -f5_minCycles{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 14959 -f5_minCycles{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 2640 -f5_minCycles{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 11006 -f5_minCycles{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 -f5_minCycles{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 -f5_minCycles{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 -f5_minCycles{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 -f5_minCycles{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 -f5_minCycles{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 -f5_minCycles{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 -f5_minCycles{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 +# HELP f5_telemetryServiceInfo_pollingInterval telemetryServiceInfo_pollingInterval +# TYPE f5_telemetryServiceInfo_pollingInterval gauge +f5_telemetryServiceInfo_pollingInterval 0 -# HELP f5_priority priority -# TYPE f5_priority gauge -f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 500 -f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 500 -f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 500 -f5_priority{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 500 -f5_priority{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 500 -f5_priority{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 500 -f5_priority{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 500 -f5_priority{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 500 -f5_priority{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 500 -f5_priority{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 500 -f5_priority{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 500 -f5_priority{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 500 -f5_priority{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 500 -f5_priority{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 500 -f5_priority{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 500 +# HELP f5_clientside_bitsIn clientside.bitsIn +# TYPE f5_clientside_bitsIn gauge +f5_clientside_bitsIn{virtualServers="/Common/shared"} 5504 +f5_clientside_bitsIn{virtualServers="/Sample_01/A1/serviceMain"} 52896 +f5_clientside_bitsIn{virtualServers="/Sample_02/A1/serviceMain"} 227168 +f5_clientside_bitsIn{virtualServers="/Sample_02/another"} 31504 -# HELP f5_totalExecutions totalExecutions -# TYPE f5_totalExecutions gauge -f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_OA_BasicAuth",events="RULE_INIT"} 4 -f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_OA_NtlmAuth",events="RULE_INIT"} 4 -f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_helper",events="HTTP_REQUEST_DATA"} 0 -f5_totalExecutions{iRules="/Common/_sys_APM_ExchangeSupport_main",events="RULE_INIT"} 4 -f5_totalExecutions{iRules="/Common/_sys_APM_MS_Office_OFBA_Support",events="RULE_INIT"} 4 -f5_totalExecutions{iRules="/Common/_sys_APM_Office365_SAML_BasicAuth",events="RULE_INIT"} 4 -f5_totalExecutions{iRules="/Common/_sys_APM_activesync",events="RULE_INIT"} 4 -f5_totalExecutions{iRules="/Common/_sys_auth_krbdelegate",events="HTTP_RESPONSE"} 0 -f5_totalExecutions{iRules="/Common/_sys_auth_ldap",events="HTTP_REQUEST"} 0 -f5_totalExecutions{iRules="/Common/_sys_auth_radius",events="HTTP_REQUEST"} 0 -f5_totalExecutions{iRules="/Common/_sys_auth_ssl_cc_ldap",events="CLIENT_ACCEPTED"} 0 -f5_totalExecutions{iRules="/Common/_sys_auth_ssl_crldp",events="CLIENT_ACCEPTED"} 0 -f5_totalExecutions{iRules="/Common/_sys_auth_ssl_ocsp",events="CLIENT_ACCEPTED"} 0 -f5_totalExecutions{iRules="/Common/_sys_auth_tacacs",events="HTTP_REQUEST"} 0 -f5_totalExecutions{iRules="/Common/_sys_https_redirect",events="HTTP_REQUEST"} 0 +# HELP f5_clientside_bitsOut clientside.bitsOut +# TYPE f5_clientside_bitsOut gauge +f5_clientside_bitsOut{virtualServers="/Common/shared"} 3072 +f5_clientside_bitsOut{virtualServers="/Sample_01/A1/serviceMain"} 32480 +f5_clientside_bitsOut{virtualServers="/Sample_02/A1/serviceMain"} 139360 +f5_clientside_bitsOut{virtualServers="/Sample_02/another"} 17856 -# HELP f5_alternate alternate -# TYPE f5_alternate gauge -f5_alternate{aPools="/Common/aPool"} 0 -f5_alternate{aaaaPools="/Common/aaaPool"} 0 -f5_alternate{cnamePools="/Common/cnamePool"} 0 -f5_alternate{mxPools="/Common/mxPool"} 0 -f5_alternate{naptrPools="/Common/NPool"} 0 -f5_alternate{srvPools="/Common/srvPool"} 0 -f5_alternate{aWideIps="/Common/awideip.example.com"} 0 -f5_alternate{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_alternate{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_alternate{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_alternate{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_clientside_curConns clientside.curConns +# TYPE f5_clientside_curConns gauge +f5_clientside_curConns{virtualServers="/Common/shared"} 0 +f5_clientside_curConns{virtualServers="/Sample_01/A1/serviceMain"} 0 +f5_clientside_curConns{virtualServers="/Sample_02/A1/serviceMain"} 0 +f5_clientside_curConns{virtualServers="/Sample_02/another"} 0 -# HELP f5_dropped dropped -# TYPE f5_dropped gauge -f5_dropped{aPools="/Common/aPool"} 0 -f5_dropped{aaaaPools="/Common/aaaPool"} 0 -f5_dropped{cnamePools="/Common/cnamePool"} 0 -f5_dropped{mxPools="/Common/mxPool"} 0 -f5_dropped{naptrPools="/Common/NPool"} 0 -f5_dropped{srvPools="/Common/srvPool"} 0 -f5_dropped{aWideIps="/Common/awideip.example.com"} 0 -f5_dropped{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_dropped{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_dropped{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_dropped{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_1024_blocks 1024-blocks +# TYPE f5_1024_blocks gauge +f5_1024_blocks{diskStorage="/"} 428150 +f5_1024_blocks{diskStorage="/dev"} 8208412 +f5_1024_blocks{diskStorage="/dev/shm"} 8217452 +f5_1024_blocks{diskStorage="/run"} 8217452 +f5_1024_blocks{diskStorage="/sys/fs/cgroup"} 8217452 +f5_1024_blocks{diskStorage="/usr"} 5186648 +f5_1024_blocks{diskStorage="/shared"} 15350768 +f5_1024_blocks{diskStorage="/shared/rrd.1.2"} 8217452 +f5_1024_blocks{diskStorage="/config"} 2171984 +f5_1024_blocks{diskStorage="/var"} 3030800 +f5_1024_blocks{diskStorage="/var/prompt"} 4096 +f5_1024_blocks{diskStorage="/var/tmstat"} 8217452 +f5_1024_blocks{diskStorage="/var/log"} 2958224 +f5_1024_blocks{diskStorage="/appdata"} 25717852 +f5_1024_blocks{diskStorage="/var/loipc"} 8217452 +f5_1024_blocks{diskStorage="/var/apm/mount/apmclients-7180.2019.119.331-4683.0.iso"} 304366 +f5_1024_blocks{diskStorage="/run/user/91"} 1643492 +f5_1024_blocks{diskStorage="/mnt/sshplugin_tempfs"} 8217452 -# HELP f5_fallback fallback -# TYPE f5_fallback gauge -f5_fallback{aPools="/Common/aPool"} 0 -f5_fallback{aaaaPools="/Common/aaaPool"} 0 -f5_fallback{cnamePools="/Common/cnamePool"} 0 -f5_fallback{mxPools="/Common/mxPool"} 0 -f5_fallback{naptrPools="/Common/NPool"} 0 -f5_fallback{srvPools="/Common/srvPool"} 0 -f5_fallback{aWideIps="/Common/awideip.example.com"} 0 -f5_fallback{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_fallback{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_fallback{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_fallback{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_r_s r/s +# TYPE f5_r_s gauge +f5_r_s{diskLatency="sda"} 1.05 +f5_r_s{diskLatency="dm-0"} 0 +f5_r_s{diskLatency="dm-1"} 0 +f5_r_s{diskLatency="dm-2"} 0.01 +f5_r_s{diskLatency="dm-3"} 0.01 +f5_r_s{diskLatency="dm-4"} 0 +f5_r_s{diskLatency="dm-5"} 0 +f5_r_s{diskLatency="dm-6"} 0.03 +f5_r_s{diskLatency="dm-7"} 0 +f5_r_s{diskLatency="dm-8"} 0.01 -# HELP f5_preferred preferred -# TYPE f5_preferred gauge -f5_preferred{aPools="/Common/aPool"} 0 -f5_preferred{aaaaPools="/Common/aaaPool"} 0 -f5_preferred{cnamePools="/Common/cnamePool"} 0 -f5_preferred{mxPools="/Common/mxPool"} 0 -f5_preferred{naptrPools="/Common/NPool"} 0 -f5_preferred{srvPools="/Common/srvPool"} 0 -f5_preferred{aWideIps="/Common/awideip.example.com"} 0 -f5_preferred{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_preferred{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_preferred{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_preferred{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_w_s w/s +# TYPE f5_w_s gauge +f5_w_s{diskLatency="sda"} 7.41 +f5_w_s{diskLatency="dm-0"} 0 +f5_w_s{diskLatency="dm-1"} 3.16 +f5_w_s{diskLatency="dm-2"} 4.48 +f5_w_s{diskLatency="dm-3"} 2.66 +f5_w_s{diskLatency="dm-4"} 0.01 +f5_w_s{diskLatency="dm-5"} 0.81 +f5_w_s{diskLatency="dm-6"} 0 +f5_w_s{diskLatency="dm-7"} 0.16 +f5_w_s{diskLatency="dm-8"} 3.83 -# HELP f5_returnFromDns returnFromDns -# TYPE f5_returnFromDns gauge -f5_returnFromDns{aPools="/Common/aPool"} 0 -f5_returnFromDns{aaaaPools="/Common/aaaPool"} 0 -f5_returnFromDns{cnamePools="/Common/cnamePool"} 0 -f5_returnFromDns{mxPools="/Common/mxPool"} 0 -f5_returnFromDns{naptrPools="/Common/NPool"} 0 -f5_returnFromDns{srvPools="/Common/srvPool"} 0 -f5_returnFromDns{aWideIps="/Common/awideip.example.com"} 0 -f5_returnFromDns{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_returnFromDns{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_returnFromDns{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_returnFromDns{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5__util %util +# TYPE f5__util gauge +f5__util{diskLatency="sda"} 1.36 +f5__util{diskLatency="dm-0"} 0 +f5__util{diskLatency="dm-1"} 0.25 +f5__util{diskLatency="dm-2"} 0.31 +f5__util{diskLatency="dm-3"} 0.24 +f5__util{diskLatency="dm-4"} 0 +f5__util{diskLatency="dm-5"} 0.09 +f5__util{diskLatency="dm-6"} 0 +f5__util{diskLatency="dm-7"} 0.01 +f5__util{diskLatency="dm-8"} 0.31 -# HELP f5_returnToDns returnToDns -# TYPE f5_returnToDns gauge -f5_returnToDns{aPools="/Common/aPool"} 0 -f5_returnToDns{aaaaPools="/Common/aaaPool"} 0 -f5_returnToDns{cnamePools="/Common/cnamePool"} 0 -f5_returnToDns{mxPools="/Common/mxPool"} 0 -f5_returnToDns{naptrPools="/Common/NPool"} 0 -f5_returnToDns{srvPools="/Common/srvPool"} 0 -f5_returnToDns{aWideIps="/Common/awideip.example.com"} 0 -f5_returnToDns{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_returnToDns{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_returnToDns{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_returnToDns{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_counters_bitsIn counters.bitsIn +# TYPE f5_counters_bitsIn gauge +f5_counters_bitsIn{networkInterfaces="1.0"} 13619749722248 +f5_counters_bitsIn{networkInterfaces="mgmt"} 28643376254552 -# HELP f5_enabled enabled -# TYPE f5_enabled gauge -f5_enabled{aPools="/Common/aPool"} 1 -f5_enabled{aaaaPools="/Common/aaaPool"} 1 -f5_enabled{cnamePools="/Common/cnamePool"} 1 -f5_enabled{mxPools="/Common/mxPool"} 1 -f5_enabled{naptrPools="/Common/NPool"} 1 -f5_enabled{srvPools="/Common/srvPool"} 1 -f5_enabled{aWideIps="/Common/awideip.example.com"} 1 -f5_enabled{aaaaWideIps="/Common/aaawideip.example.com"} 1 -f5_enabled{cnameWideIps="/Common/cnamewideip.example.com"} 1 -f5_enabled{mxWideIps="/Common/mxwideip.example.com"} 1 -f5_enabled{srvWideIps="/Common/srvwideip.example.com"} 1 +# HELP f5_counters_bitsOut counters.bitsOut +# TYPE f5_counters_bitsOut gauge +f5_counters_bitsOut{networkInterfaces="1.0"} 9802738696 +f5_counters_bitsOut{networkInterfaces="mgmt"} 12929625080 -# HELP f5_limitMaxBps limitMaxBps -# TYPE f5_limitMaxBps gauge -f5_limitMaxBps{aPools="/Common/aPool"} 0 -f5_limitMaxBps{aaaaPools="/Common/aaaPool"} 0 +# HELP f5_serverside_bitsIn serverside.bitsIn +# TYPE f5_serverside_bitsIn gauge +f5_serverside_bitsIn{pools="/Common/h.4"} 0 +f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool"} 0 +f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 0 +f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 0 +f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool1"} 0 +f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 0 +f5_serverside_bitsIn{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 0 +f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool"} 0 +f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 0 +f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 0 +f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool1"} 0 +f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 +f5_serverside_bitsIn{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 -# HELP f5_limitMaxConnections limitMaxConnections -# TYPE f5_limitMaxConnections gauge -f5_limitMaxConnections{aPools="/Common/aPool"} 0 -f5_limitMaxConnections{aaaaPools="/Common/aaaPool"} 0 +# HELP f5_serverside_bitsOut serverside.bitsOut +# TYPE f5_serverside_bitsOut gauge +f5_serverside_bitsOut{pools="/Common/h.4"} 0 +f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool"} 0 +f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 0 +f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 0 +f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool1"} 0 +f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 0 +f5_serverside_bitsOut{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 0 +f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool"} 0 +f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 0 +f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 0 +f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool1"} 0 +f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 +f5_serverside_bitsOut{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 -# HELP f5_limitMaxPps limitMaxPps -# TYPE f5_limitMaxPps gauge -f5_limitMaxPps{aPools="/Common/aPool"} 0 -f5_limitMaxPps{aaaaPools="/Common/aaaPool"} 0 +# HELP f5_serverside_curConns serverside.curConns +# TYPE f5_serverside_curConns gauge +f5_serverside_curConns{pools="/Common/h.4"} 0 +f5_serverside_curConns{pools="/Sample_01/A1/web_pool"} 0 +f5_serverside_curConns{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 0 +f5_serverside_curConns{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 0 +f5_serverside_curConns{pools="/Sample_01/A1/web_pool1"} 0 +f5_serverside_curConns{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 0 +f5_serverside_curConns{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 0 +f5_serverside_curConns{pools="/Sample_02/A1/web_pool"} 0 +f5_serverside_curConns{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 0 +f5_serverside_curConns{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 0 +f5_serverside_curConns{pools="/Sample_02/A1/web_pool1"} 0 +f5_serverside_curConns{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 +f5_serverside_curConns{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 -# HELP f5_maxAnswersReturned maxAnswersReturned -# TYPE f5_maxAnswersReturned gauge -f5_maxAnswersReturned{aPools="/Common/aPool"} 1 -f5_maxAnswersReturned{aaaaPools="/Common/aaaPool"} 1 -f5_maxAnswersReturned{mxPools="/Common/mxPool"} 1 -f5_maxAnswersReturned{naptrPools="/Common/NPool"} 1 -f5_maxAnswersReturned{srvPools="/Common/srvPool"} 1 +# HELP f5_cipherUses_adhKeyxchg cipherUses.adhKeyxchg +# TYPE f5_cipherUses_adhKeyxchg gauge +f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_adhKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_adhKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosHitRatio qosHitRatio -# TYPE f5_qosHitRatio gauge -f5_qosHitRatio{aPools="/Common/aPool"} 5 -f5_qosHitRatio{aaaaPools="/Common/aaaPool"} 5 -f5_qosHitRatio{cnamePools="/Common/cnamePool"} 5 -f5_qosHitRatio{mxPools="/Common/mxPool"} 5 -f5_qosHitRatio{naptrPools="/Common/NPool"} 5 -f5_qosHitRatio{srvPools="/Common/srvPool"} 5 +# HELP f5_cipherUses_aesBulk cipherUses.aesBulk +# TYPE f5_cipherUses_aesBulk gauge +f5_cipherUses_aesBulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_aesBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_aesBulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_aesBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_aesBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_aesBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_aesBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosHops qosHops -# TYPE f5_qosHops gauge -f5_qosHops{aPools="/Common/aPool"} 0 -f5_qosHops{aaaaPools="/Common/aaaPool"} 0 -f5_qosHops{cnamePools="/Common/cnamePool"} 0 -f5_qosHops{mxPools="/Common/mxPool"} 0 -f5_qosHops{naptrPools="/Common/NPool"} 0 -f5_qosHops{srvPools="/Common/srvPool"} 0 +# HELP f5_cipherUses_aesGcmBulk cipherUses.aesGcmBulk +# TYPE f5_cipherUses_aesGcmBulk gauge +f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_aesGcmBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_aesGcmBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosKilobytesSecond qosKilobytesSecond -# TYPE f5_qosKilobytesSecond gauge -f5_qosKilobytesSecond{aPools="/Common/aPool"} 3 -f5_qosKilobytesSecond{aaaaPools="/Common/aaaPool"} 3 -f5_qosKilobytesSecond{cnamePools="/Common/cnamePool"} 3 -f5_qosKilobytesSecond{mxPools="/Common/mxPool"} 3 -f5_qosKilobytesSecond{naptrPools="/Common/NPool"} 3 -f5_qosKilobytesSecond{srvPools="/Common/srvPool"} 3 +# HELP f5_cipherUses_camelliaBulk cipherUses.camelliaBulk +# TYPE f5_cipherUses_camelliaBulk gauge +f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_camelliaBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_camelliaBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosLcs qosLcs -# TYPE f5_qosLcs gauge -f5_qosLcs{aPools="/Common/aPool"} 30 -f5_qosLcs{aaaaPools="/Common/aaaPool"} 30 -f5_qosLcs{cnamePools="/Common/cnamePool"} 30 -f5_qosLcs{mxPools="/Common/mxPool"} 30 -f5_qosLcs{naptrPools="/Common/NPool"} 30 -f5_qosLcs{srvPools="/Common/srvPool"} 30 +# HELP f5_cipherUses_chacha20Poly1305Bulk cipherUses.chacha20Poly1305Bulk +# TYPE f5_cipherUses_chacha20Poly1305Bulk gauge +f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_chacha20Poly1305Bulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosPacketRate qosPacketRate -# TYPE f5_qosPacketRate gauge -f5_qosPacketRate{aPools="/Common/aPool"} 1 -f5_qosPacketRate{aaaaPools="/Common/aaaPool"} 1 -f5_qosPacketRate{cnamePools="/Common/cnamePool"} 1 -f5_qosPacketRate{mxPools="/Common/mxPool"} 1 -f5_qosPacketRate{naptrPools="/Common/NPool"} 1 -f5_qosPacketRate{srvPools="/Common/srvPool"} 1 +# HELP f5_cipherUses_desBulk cipherUses.desBulk +# TYPE f5_cipherUses_desBulk gauge +f5_cipherUses_desBulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_desBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_desBulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_desBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_desBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_desBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_desBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosRtt qosRtt -# TYPE f5_qosRtt gauge -f5_qosRtt{aPools="/Common/aPool"} 50 -f5_qosRtt{aaaaPools="/Common/aaaPool"} 50 -f5_qosRtt{cnamePools="/Common/cnamePool"} 50 -f5_qosRtt{mxPools="/Common/mxPool"} 50 -f5_qosRtt{naptrPools="/Common/NPool"} 50 -f5_qosRtt{srvPools="/Common/srvPool"} 50 +# HELP f5_cipherUses_dhRsaKeyxchg cipherUses.dhRsaKeyxchg +# TYPE f5_cipherUses_dhRsaKeyxchg gauge +f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_dhRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_dhRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosTopology qosTopology -# TYPE f5_qosTopology gauge -f5_qosTopology{aPools="/Common/aPool"} 0 -f5_qosTopology{aaaaPools="/Common/aaaPool"} 0 -f5_qosTopology{cnamePools="/Common/cnamePool"} 0 -f5_qosTopology{mxPools="/Common/mxPool"} 0 -f5_qosTopology{naptrPools="/Common/NPool"} 0 -f5_qosTopology{srvPools="/Common/srvPool"} 0 +# HELP f5_cipherUses_dheDssKeyxchg cipherUses.dheDssKeyxchg +# TYPE f5_cipherUses_dheDssKeyxchg gauge +f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_dheDssKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_dheDssKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosVsCapacity qosVsCapacity -# TYPE f5_qosVsCapacity gauge -f5_qosVsCapacity{aPools="/Common/aPool"} 0 -f5_qosVsCapacity{aaaaPools="/Common/aaaPool"} 0 -f5_qosVsCapacity{cnamePools="/Common/cnamePool"} 0 -f5_qosVsCapacity{mxPools="/Common/mxPool"} 0 -f5_qosVsCapacity{naptrPools="/Common/NPool"} 0 -f5_qosVsCapacity{srvPools="/Common/srvPool"} 0 +# HELP f5_cipherUses_ecdhEcdsaKeyxchg cipherUses.ecdhEcdsaKeyxchg +# TYPE f5_cipherUses_ecdhEcdsaKeyxchg gauge +f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_ecdhEcdsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_qosVsScore qosVsScore -# TYPE f5_qosVsScore gauge -f5_qosVsScore{aPools="/Common/aPool"} 0 -f5_qosVsScore{aaaaPools="/Common/aaaPool"} 0 -f5_qosVsScore{cnamePools="/Common/cnamePool"} 0 -f5_qosVsScore{mxPools="/Common/mxPool"} 0 -f5_qosVsScore{naptrPools="/Common/NPool"} 0 -f5_qosVsScore{srvPools="/Common/srvPool"} 0 +# HELP f5_cipherUses_ecdhRsaKeyxchg cipherUses.ecdhRsaKeyxchg +# TYPE f5_cipherUses_ecdhRsaKeyxchg gauge +f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_ecdhRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_ttl ttl -# TYPE f5_ttl gauge -f5_ttl{aPools="/Common/aPool"} 30 -f5_ttl{aaaaPools="/Common/aaaPool"} 30 -f5_ttl{cnamePools="/Common/cnamePool"} 30 -f5_ttl{mxPools="/Common/mxPool"} 30 -f5_ttl{naptrPools="/Common/NPool"} 30 -f5_ttl{srvPools="/Common/srvPool"} 30 +# HELP f5_cipherUses_ecdheEcdsaKeyxchg cipherUses.ecdheEcdsaKeyxchg +# TYPE f5_cipherUses_ecdheEcdsaKeyxchg gauge +f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_ecdheEcdsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_cnameResolutions cnameResolutions -# TYPE f5_cnameResolutions gauge -f5_cnameResolutions{aWideIps="/Common/awideip.example.com"} 0 -f5_cnameResolutions{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_cnameResolutions{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_cnameResolutions{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_cnameResolutions{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_ecdheRsaKeyxchg cipherUses.ecdheRsaKeyxchg +# TYPE f5_cipherUses_ecdheRsaKeyxchg gauge +f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_ecdheRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_persisted persisted -# TYPE f5_persisted gauge -f5_persisted{aWideIps="/Common/awideip.example.com"} 0 -f5_persisted{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_persisted{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_persisted{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_persisted{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_edhRsaKeyxchg cipherUses.edhRsaKeyxchg +# TYPE f5_cipherUses_edhRsaKeyxchg gauge +f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_edhRsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_edhRsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_rcode rcode -# TYPE f5_rcode gauge -f5_rcode{aWideIps="/Common/awideip.example.com"} 0 -f5_rcode{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_rcode{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_rcode{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_rcode{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_ideaBulk cipherUses.ideaBulk +# TYPE f5_cipherUses_ideaBulk gauge +f5_cipherUses_ideaBulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_ideaBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_ideaBulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_ideaBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_ideaBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_ideaBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_ideaBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_requests requests -# TYPE f5_requests gauge -f5_requests{aWideIps="/Common/awideip.example.com"} 0 -f5_requests{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_requests{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_requests{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_requests{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_md5Digest cipherUses.md5Digest +# TYPE f5_cipherUses_md5Digest gauge +f5_cipherUses_md5Digest{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_md5Digest{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_md5Digest{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_md5Digest{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_md5Digest{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_md5Digest{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_md5Digest{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_resolutions resolutions -# TYPE f5_resolutions gauge -f5_resolutions{aWideIps="/Common/awideip.example.com"} 0 -f5_resolutions{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_resolutions{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_resolutions{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_resolutions{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_nullBulk cipherUses.nullBulk +# TYPE f5_cipherUses_nullBulk gauge +f5_cipherUses_nullBulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_nullBulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_nullBulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_nullBulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_nullBulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_nullBulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_nullBulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 + +# HELP f5_cipherUses_nullDigest cipherUses.nullDigest +# TYPE f5_cipherUses_nullDigest gauge +f5_cipherUses_nullDigest{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_nullDigest{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_nullDigest{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_nullDigest{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_nullDigest{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_nullDigest{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_nullDigest{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_failureRcodeTtl failureRcodeTtl -# TYPE f5_failureRcodeTtl gauge -f5_failureRcodeTtl{aWideIps="/Common/awideip.example.com"} 0 -f5_failureRcodeTtl{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_failureRcodeTtl{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_failureRcodeTtl{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_failureRcodeTtl{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_rc2Bulk cipherUses.rc2Bulk +# TYPE f5_cipherUses_rc2Bulk gauge +f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_rc2Bulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_rc2Bulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_lastResortPool lastResortPool -# TYPE f5_lastResortPool gauge -f5_lastResortPool{aWideIps="/Common/awideip.example.com"} 0 -f5_lastResortPool{aaaaWideIps="/Common/aaawideip.example.com"} 0 -f5_lastResortPool{cnameWideIps="/Common/cnamewideip.example.com"} 0 -f5_lastResortPool{mxWideIps="/Common/mxwideip.example.com"} 0 -f5_lastResortPool{srvWideIps="/Common/srvwideip.example.com"} 0 +# HELP f5_cipherUses_rc4Bulk cipherUses.rc4Bulk +# TYPE f5_cipherUses_rc4Bulk gauge +f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_rc4Bulk{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_rc4Bulk{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_persistCidrIpv4 persistCidrIpv4 -# TYPE f5_persistCidrIpv4 gauge -f5_persistCidrIpv4{aWideIps="/Common/awideip.example.com"} 32 -f5_persistCidrIpv4{aaaaWideIps="/Common/aaawideip.example.com"} 32 -f5_persistCidrIpv4{cnameWideIps="/Common/cnamewideip.example.com"} 32 -f5_persistCidrIpv4{mxWideIps="/Common/mxwideip.example.com"} 32 -f5_persistCidrIpv4{srvWideIps="/Common/srvwideip.example.com"} 32 +# HELP f5_cipherUses_rsaKeyxchg cipherUses.rsaKeyxchg +# TYPE f5_cipherUses_rsaKeyxchg gauge +f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_rsaKeyxchg{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_rsaKeyxchg{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_persistCidrIpv6 persistCidrIpv6 -# TYPE f5_persistCidrIpv6 gauge -f5_persistCidrIpv6{aWideIps="/Common/awideip.example.com"} 128 -f5_persistCidrIpv6{aaaaWideIps="/Common/aaawideip.example.com"} 128 -f5_persistCidrIpv6{cnameWideIps="/Common/cnamewideip.example.com"} 128 -f5_persistCidrIpv6{mxWideIps="/Common/mxwideip.example.com"} 128 -f5_persistCidrIpv6{srvWideIps="/Common/srvwideip.example.com"} 128 +# HELP f5_cipherUses_shaDigest cipherUses.shaDigest +# TYPE f5_cipherUses_shaDigest gauge +f5_cipherUses_shaDigest{clientSslProfiles="/Common/clientssl"} 0 +f5_cipherUses_shaDigest{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_cipherUses_shaDigest{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_cipherUses_shaDigest{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_cipherUses_shaDigest{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_cipherUses_shaDigest{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/serverssl"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_cipherUses_shaDigest{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_ttlPersistence ttlPersistence -# TYPE f5_ttlPersistence gauge -f5_ttlPersistence{aWideIps="/Common/awideip.example.com"} 3600 -f5_ttlPersistence{aaaaWideIps="/Common/aaawideip.example.com"} 3600 -f5_ttlPersistence{cnameWideIps="/Common/cnamewideip.example.com"} 3600 -f5_ttlPersistence{mxWideIps="/Common/mxwideip.example.com"} 3600 -f5_ttlPersistence{srvWideIps="/Common/srvwideip.example.com"} 3600 +# HELP f5_protocolUses_dtlsv1 protocolUses.dtlsv1 +# TYPE f5_protocolUses_dtlsv1 gauge +f5_protocolUses_dtlsv1{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_dtlsv1{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_dtlsv1{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_dtlsv1{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_dtlsv1{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_dtlsv1{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_dtlsv1{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_system_configSyncSucceeded system_configSyncSucceeded -# TYPE f5_system_configSyncSucceeded gauge -f5_system_configSyncSucceeded 1 +# HELP f5_protocolUses_sslv2 protocolUses.sslv2 +# TYPE f5_protocolUses_sslv2 gauge +f5_protocolUses_sslv2{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_sslv2{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_sslv2{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_sslv2{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_sslv2{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_sslv2{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_sslv2{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_system_syncSummary system_syncSummary -# TYPE f5_system_syncSummary gauge -f5_system_syncSummary 0 +# HELP f5_protocolUses_sslv3 protocolUses.sslv3 +# TYPE f5_protocolUses_sslv3 gauge +f5_protocolUses_sslv3{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_sslv3{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_sslv3{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_sslv3{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_sslv3{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_sslv3{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_sslv3{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_system_cpu system_cpu -# TYPE f5_system_cpu gauge -f5_system_cpu 7 +# HELP f5_protocolUses_tlsv1 protocolUses.tlsv1 +# TYPE f5_protocolUses_tlsv1 gauge +f5_protocolUses_tlsv1{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_tlsv1{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_tlsv1{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_tlsv1{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_tlsv1{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_tlsv1{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_system_memory system_memory -# TYPE f5_system_memory gauge -f5_system_memory 57 +# HELP f5_protocolUses_tlsv1_1 protocolUses.tlsv1_1 +# TYPE f5_protocolUses_tlsv1_1 gauge +f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_tlsv1_1{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_tlsv1_1{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_system_tmmCpu system_tmmCpu -# TYPE f5_system_tmmCpu gauge -f5_system_tmmCpu 3 +# HELP f5_protocolUses_tlsv1_2 protocolUses.tlsv1_2 +# TYPE f5_protocolUses_tlsv1_2 gauge +f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_tlsv1_2{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_tlsv1_2{serverSslProfiles="/Common/wom-default-serverssl"} 0 -# HELP f5_system_tmmMemory system_tmmMemory -# TYPE f5_system_tmmMemory gauge -f5_system_tmmMemory 17 +# HELP f5_protocolUses_tlsv1_3 protocolUses.tlsv1_3 +# TYPE f5_protocolUses_tlsv1_3 gauge +f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/clientssl"} 0 +f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/clientssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/clientssl-secure"} 0 +f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/crypto-server-default-clientssl"} 0 +f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/splitsession-default-clientssl"} 0 +f5_protocolUses_tlsv1_3{clientSslProfiles="/Common/wom-default-clientssl"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/apm-default-serverssl"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/crypto-client-default-serverssl"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/pcoip-default-serverssl"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/serverssl"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/serverssl-insecure-compatible"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/splitsession-default-serverssl"} 0 +f5_protocolUses_tlsv1_3{serverSslProfiles="/Common/wom-default-serverssl"} 0 # HELP f5_system_tmmTraffic_clientSideTraffic_bitsIn system_tmmTraffic_clientSideTraffic.bitsIn # TYPE f5_system_tmmTraffic_clientSideTraffic_bitsIn gauge @@ -1569,10 +1573,6 @@ f5_system_tmmTraffic_serverSideTraffic_bitsIn 8458221624 # HELP f5_system_tmmTraffic_serverSideTraffic_bitsOut system_tmmTraffic_serverSideTraffic.bitsOut # TYPE f5_system_tmmTraffic_serverSideTraffic_bitsOut gauge f5_system_tmmTraffic_serverSideTraffic_bitsOut 862169712 - -# HELP f5_telemetryServiceInfo_pollingInterval telemetryServiceInfo_pollingInterval -# TYPE f5_telemetryServiceInfo_pollingInterval gauge -f5_telemetryServiceInfo_pollingInterval 0 `, virtualServers: `# HELP f5_clientside_bitsIn clientside.bitsIn # TYPE f5_clientside_bitsIn gauge @@ -1628,6 +1628,17 @@ f5_lowestPriogrp{pools="/Sample_01/A1/web_pool1"} 0 f5_lowestPriogrp{pools="/Sample_02/A1/web_pool"} 0 f5_lowestPriogrp{pools="/Sample_02/A1/web_pool1"} 0 +# HELP f5_port port +# TYPE f5_port gauge +f5_port{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 80 +f5_port{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 80 +f5_port{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 80 +f5_port{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 80 +f5_port{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 80 +f5_port{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 80 +f5_port{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 80 +f5_port{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 80 + # HELP f5_serverside_bitsIn serverside.bitsIn # TYPE f5_serverside_bitsIn gauge f5_serverside_bitsIn{pools="/Common/h.4"} 0 @@ -1675,17 +1686,6 @@ f5_serverside_curConns{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0. f5_serverside_curConns{pools="/Sample_02/A1/web_pool1"} 0 f5_serverside_curConns{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 0 f5_serverside_curConns{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 0 - -# HELP f5_port port -# TYPE f5_port gauge -f5_port{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.10:80"} 80 -f5_port{pools="/Sample_01/A1/web_pool",members="/Sample_01/192.0.1.11:80"} 80 -f5_port{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.12:80"} 80 -f5_port{pools="/Sample_01/A1/web_pool1",members="/Sample_01/192.0.1.13:80"} 80 -f5_port{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.10:80"} 80 -f5_port{pools="/Sample_02/A1/web_pool",members="/Sample_02/192.0.2.11:80"} 80 -f5_port{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.12:80"} 80 -f5_port{pools="/Sample_02/A1/web_pool1",members="/Sample_02/192.0.2.13:80"} 80 ` } }; diff --git a/test/unit/pullConsumers/prometheusPullConsumerTests.js b/test/unit/pullConsumers/prometheusPullConsumerTests.js index b006c946..10f8584e 100644 --- a/test/unit/pullConsumers/prometheusPullConsumerTests.js +++ b/test/unit/pullConsumers/prometheusPullConsumerTests.js @@ -15,6 +15,7 @@ require('../shared/restoreCache')(); const chai = require('chai'); const chaiAsPromised = require('chai-as-promised'); const sinon = require('sinon'); +const lodash = require('lodash'); const prometheusConsumer = require('../../../src/lib/pullConsumers/Prometheus'); const testUtil = require('../shared/util'); @@ -25,11 +26,18 @@ const SYSTEM_POLLER_DATA = require('./data/system_poller_datasets.json'); chai.use(chaiAsPromised); const assert = chai.assert; +const arraysToPromLines = input => lodash.flatten(input).join('\n'); + describe('Prometheus Pull Consumer', () => { - const context = testUtil.buildConsumerContext({ - config: {} + let context; + let eventStub; + + beforeEach(() => { + context = testUtil.buildConsumerContext({ + config: {} + }); + eventStub = sinon.stub(context, 'event').value([[{}]]); }); - context.event = [[{}]]; afterEach(() => { sinon.restore(); @@ -37,8 +45,8 @@ describe('Prometheus Pull Consumer', () => { it('should process event', () => assert.isFulfilled(prometheusConsumer(context))); - it('should reject on missing event', () => { - sinon.stub(context, 'event').value(null); + it('should reject on null event', () => { + eventStub.value(null); return assert.isRejected( prometheusConsumer(context), /No event data to process/ @@ -46,7 +54,7 @@ describe('Prometheus Pull Consumer', () => { }); it('should not reject on missing event data', () => { - sinon.stub(context, 'event').value([[]]); + eventStub.value([[]]); return prometheusConsumer(context) .then((data) => { assert.strictEqual(data, '', 'should be empty string'); @@ -60,7 +68,7 @@ describe('Prometheus Pull Consumer', () => { describe('formatting System Poller data', () => { it('should format data (unfiltered)', () => { - sinon.stub(context, 'event').value([SYSTEM_POLLER_DATA.unfiltered]); + eventStub.value([SYSTEM_POLLER_DATA.unfiltered]); return prometheusConsumer(context) .then((data) => { assert.strictEqual(data, EXPECTED_DATA.unfiltered); @@ -68,21 +76,47 @@ describe('Prometheus Pull Consumer', () => { }); it('should format data (just virtualServers)', () => { - sinon.stub(context, 'event').value([SYSTEM_POLLER_DATA.virtualServers]); + eventStub.value([SYSTEM_POLLER_DATA.virtualServers]); return prometheusConsumer(context) .then((data) => { assert.strictEqual(data, EXPECTED_DATA.virtualServers); }); }); - it('should format data from 2 System Pollers (virtualServers and pools', () => { - sinon.stub(context, 'event').value([SYSTEM_POLLER_DATA.virtualServers, SYSTEM_POLLER_DATA.pools]); + it('should format data from 2 System Pollers (virtualServers and pools)', () => { + eventStub.value([SYSTEM_POLLER_DATA.virtualServers, SYSTEM_POLLER_DATA.pools]); return prometheusConsumer(context) .then((data) => { assert.strictEqual(data, EXPECTED_DATA.poolsAndVirtuals); }); }); + it('should format data with similarly named objects (isCustom=false)', () => { + eventStub.value([{ + data: { + pools: { + '/Common/my-pool/stats': { + activeMemberCnt: 1 + }, + '/Common/my_pool/stats': { + activeMemberCnt: 3 + } + } + }, + isCustom: false + }]); + + const expectedData = arraysToPromLines([ + '# HELP f5_activeMemberCnt activeMemberCnt', '# TYPE f5_activeMemberCnt gauge', + 'f5_activeMemberCnt{pools="/Common/my-pool/stats"} 1', 'f5_activeMemberCnt{pools="/Common/my_pool/stats"} 3', '' + ]); + + return prometheusConsumer(context) + .then((data) => { + assert.strictEqual(data, expectedData); + }); + }); + describe('Custom metrics', () => { const mockCustomData = { data: { @@ -94,9 +128,12 @@ describe('Prometheus Pull Consumer', () => { it('should use metric-name formatting (isCustom=true)', () => { const thisData = testUtil.deepCopy(mockCustomData); thisData.isCustom = true; - sinon.stub(context, 'event').value([thisData]); + eventStub.value([thisData]); - const expectedData = '# HELP f5_pools_thisIsPool1_myMetric pools_thisIsPool1_myMetric\n# TYPE f5_pools_thisIsPool1_myMetric gauge\nf5_pools_thisIsPool1_myMetric 12\n'; + const expectedData = arraysToPromLines([ + '# HELP f5_pools_thisIsPool1_myMetric pools_thisIsPool1_myMetric', '# TYPE f5_pools_thisIsPool1_myMetric gauge', + 'f5_pools_thisIsPool1_myMetric 12', '' + ]); return prometheusConsumer(context) .then((data) => { @@ -105,12 +142,76 @@ describe('Prometheus Pull Consumer', () => { }); it('should apply label-based formatting by default (isCustom=undefined)', () => { - sinon.stub(context, 'event').value([mockCustomData]); + eventStub.value([mockCustomData]); + + const expectedData = arraysToPromLines( + ['# HELP f5_myMetric myMetric', '# TYPE f5_myMetric gauge', 'f5_myMetric{pools="thisIsPool1"} 12', ''] + ); + + return prometheusConsumer(context) + .then((data) => { + assert.strictEqual(data, expectedData); + }); + }); + + it('should reformat special characters in metric payload (isCustom=true)', () => { + eventStub.value([{ + data: { + memory: { + 'my name': { + allocated: 125 + }, + 'my&name': { + allocated: 300 + }, + my_name: { + allocated: 275 + } + } + }, + isCustom: true + }]); + const expectedData = arraysToPromLines([ + ['# HELP f5_memory_my_name_allocated memory_my_name_allocated', '# TYPE f5_memory_my_name_allocated gauge', 'f5_memory_my_name_allocated 275', ''], + ['# HELP f5_memory_my__x20__name_allocated memory_my name_allocated', '# TYPE f5_memory_my__x20__name_allocated gauge', 'f5_memory_my__x20__name_allocated 125', ''], + ['# HELP f5_memory_my__x26__name_allocated memory_my&name_allocated', '# TYPE f5_memory_my__x26__name_allocated gauge', 'f5_memory_my__x26__name_allocated 300', ''] + ]); + + return prometheusConsumer(context) + .then((data) => { + assert.strictEqual(data, expectedData); + }); + }); - const expectedData = '# HELP f5_myMetric myMetric\n# TYPE f5_myMetric gauge\nf5_myMetric{pools="thisIsPool1"} 12\n'; + it('should log but not error when duplicate metric name encountered (isCustom=true)', () => { + eventStub.value([{ + data: { + memory: { + 'my name': { + allocated: 125 + }, + my_name: { + allocated: 175 + }, + my__x20__name: { + allocated: 11 + } + } + }, + isCustom: true + }]); + + const expectedData = arraysToPromLines([ + ['# HELP f5_memory_my_name_allocated memory_my_name_allocated', '# TYPE f5_memory_my_name_allocated gauge', 'f5_memory_my_name_allocated 175', ''], + ['# HELP f5_memory_my__x20__name_allocated memory_my__x20__name_allocated', '# TYPE f5_memory_my__x20__name_allocated gauge', 'f5_memory_my__x20__name_allocated 11', ''] + ]); return prometheusConsumer(context) .then((data) => { + assert.deepStrictEqual( + context.logger.error.getCalls()[0].args[0], + 'Unable to register metric for: memory_my name_allocated. A metric with the name f5_memory_my__x20__name_allocated has already been registered.' + ); assert.strictEqual(data, expectedData); }); }); diff --git a/test/unit/requestHandlers/ihealthPollerHandlerTests.js b/test/unit/requestHandlers/ihealthPollerHandlerTests.js index 60f730ba..5aba7310 100644 --- a/test/unit/requestHandlers/ihealthPollerHandlerTests.js +++ b/test/unit/requestHandlers/ihealthPollerHandlerTests.js @@ -113,7 +113,7 @@ describe('IHealthPollerHandler', () => { assert.sameDeepMembers( restOpMock.getBody().message.map(s => s.name), [ - 'System::iHealthPoller_1', + 'f5telemetry_default::System::iHealthPoller_1', 'Namespace::System::iHealthPoller_1' ], 'should return expected body' @@ -165,7 +165,7 @@ describe('IHealthPollerHandler', () => { .then(() => { assert.strictEqual(restOpMock.getStatusCode(), 201, 'should return expected code'); assert.strictEqual(restOpMock.getBody().code, 201, 'should return expected code'); - assert.deepStrictEqual(restOpMock.getBody().state.name, 'System::iHealthPoller_1 (DEMO)', 'should return expected body'); + assert.deepStrictEqual(restOpMock.getBody().state.name, 'f5telemetry_default::System::iHealthPoller_1 (DEMO)', 'should return expected body'); }); }); @@ -175,7 +175,7 @@ describe('IHealthPollerHandler', () => { .then(() => { assert.strictEqual(restOpMock.getStatusCode(), 201, 'should return expected code'); assert.strictEqual(restOpMock.getBody().code, 201, 'should return expected code'); - assert.deepStrictEqual(restOpMock.getBody().state.name, 'System::iHealthPoller_1 (DEMO)', 'should return expected body'); + assert.deepStrictEqual(restOpMock.getBody().state.name, 'f5telemetry_default::System::iHealthPoller_1 (DEMO)', 'should return expected body'); restOpMock = new testUtil.MockRestOperation({ method: 'GET' }); restOpMock.parseAndSetURI('http://localhost:8100/ihealthpoller/System'); @@ -184,7 +184,7 @@ describe('IHealthPollerHandler', () => { .then(() => { assert.strictEqual(restOpMock.getStatusCode(), 202, 'should return expected code'); assert.strictEqual(restOpMock.getBody().code, 202, 'should return expected code'); - assert.deepStrictEqual(restOpMock.getBody().state.name, 'System::iHealthPoller_1 (DEMO)', 'should return expected body'); + assert.deepStrictEqual(restOpMock.getBody().state.name, 'f5telemetry_default::System::iHealthPoller_1 (DEMO)', 'should return expected body'); }); }); }); diff --git a/test/unit/systemPollerTests.js b/test/unit/systemPollerTests.js index 4dde51ac..0000c680 100644 --- a/test/unit/systemPollerTests.js +++ b/test/unit/systemPollerTests.js @@ -312,12 +312,12 @@ describe('System Poller', () => { sinon.stub(systemPoller, 'getPollerTimers').returns(pollerTimers); return configWorker.processDeclaration(testUtil.deepCopy(defaultDeclaration)) .then(() => { - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.args[0].traceName, 'My_System::SystemPoller_1'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].config.traceName, 'My_System::SystemPoller_1'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.args[0].traceName, 'f5telemetry_default::My_System::SystemPoller_1'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].config.traceName, 'f5telemetry_default::My_System::SystemPoller_1'); assert.lengthOf(tracer.registered(), 1); - testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.My_System::SystemPoller_1']); + testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1']); pollerTimersBefore = Object.assign({}, pollerTimers); }); }); @@ -326,7 +326,7 @@ describe('System Poller', () => { .then(() => { assert.deepStrictEqual(pollerTimers, {}); assert.isEmpty(tracer.registered()); - assert.isFalse(pollerTimersBefore['My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimersBefore['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); })); it('should update existing poller(s)', () => { @@ -335,9 +335,9 @@ describe('System Poller', () => { newDeclaration.My_System.systemPoller.trace = true; const expectedPollerConfig = { name: 'SystemPoller_1', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', systemName: 'My_System', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -346,7 +346,7 @@ describe('System Poller', () => { enable: true, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, tracer: tracer.registered()[0], @@ -378,12 +378,12 @@ describe('System Poller', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { assert.lengthOf(tracer.registered(), 1); - testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.My_System::SystemPoller_1']); - assert.deepStrictEqual(pollerTimers['My_System::SystemPoller_1'].config, expectedPollerConfig); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 500, 'should set configured interval'); + testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1']); + assert.deepStrictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].config, expectedPollerConfig); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 500, 'should set configured interval'); assert.deepStrictEqual( - pollerTimers['My_System::SystemPoller_1'].timer.args, + pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.args, [expectedPollerConfig], 'should pass configuration as arg' ); @@ -397,7 +397,7 @@ describe('System Poller', () => { .then(() => { assert.deepStrictEqual(pollerTimers, {}); assert.isEmpty(tracer.registered()); - assert.isFalse(pollerTimersBefore['My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimersBefore['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); }); }); @@ -408,11 +408,11 @@ describe('System Poller', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { assert.lengthOf(Object.keys(pollerTimers), 1); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].config.traceName, 'My_System::SystemPoller_1'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].config.traceName, 'f5telemetry_default::My_System::SystemPoller_1'); assert.lengthOf(tracer.registered(), 1); - testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.My_System::SystemPoller_1']); + testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1']); }); }); @@ -423,7 +423,7 @@ describe('System Poller', () => { .then(() => { assert.deepStrictEqual(pollerTimers, {}); assert.isEmpty(tracer.registered()); - assert.isFalse(pollerTimersBefore['My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimersBefore['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); }); }); @@ -434,11 +434,11 @@ describe('System Poller', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { assert.lengthOf(Object.keys(pollerTimers), 1); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].config.traceName, 'My_System::SystemPoller_1'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].config.traceName, 'f5telemetry_default::My_System::SystemPoller_1'); assert.lengthOf(tracer.registered(), 1); - testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.My_System::SystemPoller_1']); + testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1']); }); }); @@ -450,14 +450,14 @@ describe('System Poller', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { assert.lengthOf(Object.keys(pollerTimers), 2); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].config.traceName, 'My_System::SystemPoller_1'); - assert.isTrue(pollerTimers['My_System_New::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System_New::SystemPoller_1'].timer.intervalInS, 500, 'should set configured interval'); - assert.strictEqual(pollerTimers['My_System_New::SystemPoller_1'].config.traceName, 'My_System_New::SystemPoller_1'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].config.traceName, 'f5telemetry_default::My_System::SystemPoller_1'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System_New::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System_New::SystemPoller_1'].timer.intervalInS, 500, 'should set configured interval'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System_New::SystemPoller_1'].config.traceName, 'f5telemetry_default::My_System_New::SystemPoller_1'); assert.lengthOf(tracer.registered(), 1); - testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.My_System::SystemPoller_1']); + testAssert.sameOrderedMatches(registeredTracerPaths(), ['Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1']); }); }); @@ -486,37 +486,37 @@ describe('System Poller', () => { return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { assert.lengthOf(Object.keys(pollerTimers), 3); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); - assert.isTrue(pollerTimers['My_System_New::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System_New::SystemPoller_1'].timer.intervalInS, 10, 'should set configured interval'); - assert.isTrue(pollerTimers['My_System_New::My_Poller'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System_New::My_Poller'].timer.intervalInS, 500, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System_New::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System_New::SystemPoller_1'].timer.intervalInS, 10, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System_New::My_Poller'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System_New::My_Poller'].timer.intervalInS, 500, 'should set configured interval'); testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'Telemetry_System_Poller.My_System::SystemPoller_1', - 'Telemetry_System_Poller.My_System_New::My_Poller', - 'Telemetry_System_Poller.My_System_New::SystemPoller_1' + 'Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', + 'Telemetry_System_Poller.f5telemetry_default::My_System_New::My_Poller', + 'Telemetry_System_Poller.f5telemetry_default::My_System_New::SystemPoller_1' ]); assert.deepStrictEqual( - pollerTimers['My_System_New::My_Poller'].timer.args, + pollerTimers['f5telemetry_default::My_System_New::My_Poller'].timer.args, [ { - id: 'My_System_New::My_Poller', + id: 'f5telemetry_default::My_System_New::My_Poller', name: 'My_Poller', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', systemName: 'My_System_New', - traceName: 'My_System_New::My_Poller', + traceName: 'f5telemetry_default::My_System_New::My_Poller', enable: true, interval: 500, trace: { enable: true, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_New::My_Poller', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_New::My_Poller', type: 'output' }, - tracer: tracer.registered().find(t => /Telemetry_System_Poller.My_System_New::My_Poller/.test(t.path)), + tracer: tracer.registered().find(t => /Telemetry_System_Poller.f5telemetry_default::My_System_New::My_Poller/.test(t.path)), credentials: { username: undefined, passphrase: undefined @@ -546,11 +546,11 @@ describe('System Poller', () => { 'should pass configuration as arg' ); assert.deepStrictEqual( - pollerTimers['My_System_New::SystemPoller_1'].timer.args, + pollerTimers['f5telemetry_default::My_System_New::SystemPoller_1'].timer.args, [ { name: 'SystemPoller_1', - id: 'My_System_New::SystemPoller_1', + id: 'f5telemetry_default::My_System_New::SystemPoller_1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -559,12 +559,12 @@ describe('System Poller', () => { enable: true, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System_New::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System_New::SystemPoller_1', type: 'output' }, systemName: 'My_System_New', - tracer: tracer.registered().find(t => /Telemetry_System_Poller.My_System_New::SystemPoller_1/.test(t.path)), - traceName: 'My_System_New::SystemPoller_1', + tracer: tracer.registered().find(t => /Telemetry_System_Poller.f5telemetry_default::My_System_New::SystemPoller_1/.test(t.path)), + traceName: 'f5telemetry_default::My_System_New::SystemPoller_1', credentials: { username: undefined, passphrase: undefined @@ -620,9 +620,9 @@ describe('System Poller', () => { }; return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); assert.strictEqual( - pollerTimers['My_System::SystemPoller_1'].timer.args[0].dataOpts.noTMStats, + pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.args[0].dataOpts.noTMStats, false, 'should enable TMStats' ); @@ -634,8 +634,8 @@ describe('System Poller', () => { newDeclaration.My_System.systemPoller.interval = 0; return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { - assert.isFalse(pollerTimersBefore['My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); - assert.deepStrictEqual(pollerTimers, { 'My_System::SystemPoller_1': undefined }); + assert.isFalse(pollerTimersBefore['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); + assert.deepStrictEqual(pollerTimers, { 'f5telemetry_default::My_System::SystemPoller_1': undefined }); }); }); @@ -644,17 +644,17 @@ describe('System Poller', () => { newDeclaration.My_System.systemPoller.interval = 200; return configWorker.processDeclaration(testUtil.deepCopy(newDeclaration)) .then(() => { - assert.isTrue(pollerTimersBefore['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 200); + assert.isTrue(pollerTimersBefore['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 200); assert.lengthOf(Object.keys(pollerTimers), 1); assert.deepStrictEqual( - pollerTimers['My_System::SystemPoller_1'].timer.args, + pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.args, [ { name: 'SystemPoller_1', - traceName: 'My_System::SystemPoller_1', + traceName: 'f5telemetry_default::My_System::SystemPoller_1', systemName: 'My_System', - id: 'My_System::SystemPoller_1', + id: 'f5telemetry_default::My_System::SystemPoller_1', namespace: 'f5telemetry_default', class: 'Telemetry_System_Poller', enable: true, @@ -663,7 +663,7 @@ describe('System Poller', () => { enable: true, encoding: 'utf8', maxRecords: 10, - path: '/var/tmp/telemetry/Telemetry_System_Poller.My_System::SystemPoller_1', + path: '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1', type: 'output' }, tracer: tracer.registered()[0], @@ -709,18 +709,18 @@ describe('System Poller', () => { } } }; - const updateSpy = sinon.spy(pollerTimers['My_System::SystemPoller_1'].timer, 'update'); + const updateSpy = sinon.spy(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer, 'update'); return configWorker.processNamespaceDeclaration(testUtil.deepCopy(newNamespace), 'NewNamespace') .then(() => { assert.lengthOf(Object.keys(pollerTimers), 2); assert.strictEqual(updateSpy.callCount, 0, 'should not call updated'); - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); assert.isTrue(pollerTimers['NewNamespace::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); assert.strictEqual(pollerTimers['NewNamespace::My_System::SystemPoller_1'].timer.intervalInS, 500, 'should set configured interval'); testAssert.sameOrderedMatches(registeredTracerPaths(), [ - 'Telemetry_System_Poller.My_System::SystemPoller_1', - 'Telemetry_System_Poller.NewNamespace::My_System::SystemPoller_1' + 'Telemetry_System_Poller.NewNamespace::My_System::SystemPoller_1', + 'Telemetry_System_Poller.f5telemetry_default::My_System::SystemPoller_1' ]); }); }); @@ -754,30 +754,30 @@ describe('System Poller', () => { sinon.stub(systemPoller, 'getPollerTimers').returns(pollerTimers); return configWorker.processDeclaration(testUtil.deepCopy(defaultDeclaration)) .then(() => { - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.isTrue(pollerTimers['My_System::SystemPoller_2'].timer.isActive(), 'should be active'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_2'].timer.isActive(), 'should be active'); }); }); it('should disable running pollers when thresholds not ok', () => monitor.safeEmitAsync('check', constants.APP_THRESHOLDS.MEMORY.NOT_OK) .then(() => { - assert.isFalse(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); - assert.isFalse(pollerTimers['My_System::SystemPoller_2'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimers['f5telemetry_default::My_System::SystemPoller_2'].timer.isActive(), 'should be inactive'); assert.isFalse(systemPoller.isEnabled(), 'should set processingEnabled to false'); })); it('should enable disabled pollers when thresholds become ok', () => monitor.safeEmitAsync('check', constants.APP_THRESHOLDS.MEMORY.NOT_OK) .then(() => { - assert.isFalse(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); - assert.isFalse(pollerTimers['My_System::SystemPoller_2'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be inactive'); + assert.isFalse(pollerTimers['f5telemetry_default::My_System::SystemPoller_2'].timer.isActive(), 'should be inactive'); assert.isFalse(systemPoller.isEnabled(), 'should set processingEnabled to false'); return monitor.safeEmitAsync('check', constants.APP_THRESHOLDS.MEMORY.OK); }) .then(() => { - assert.isTrue(pollerTimers['My_System::SystemPoller_1'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); - assert.isTrue(pollerTimers['My_System::SystemPoller_2'].timer.isActive(), 'should be active'); - assert.strictEqual(pollerTimers['My_System::SystemPoller_2'].timer.intervalInS, 200, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_1'].timer.intervalInS, 180, 'should set configured interval'); + assert.isTrue(pollerTimers['f5telemetry_default::My_System::SystemPoller_2'].timer.isActive(), 'should be active'); + assert.strictEqual(pollerTimers['f5telemetry_default::My_System::SystemPoller_2'].timer.intervalInS, 200, 'should set configured interval'); assert.isTrue(systemPoller.isEnabled(), 'should set processingEnabled to true'); })); }); diff --git a/test/unit/utils/configTests.js b/test/unit/utils/configTests.js index 185bdbe0..677404dc 100644 --- a/test/unit/utils/configTests.js +++ b/test/unit/utils/configTests.js @@ -278,7 +278,7 @@ describe('Config Util', () => { return parseDeclaration(decl) .then(() => { const parsedConf = configWorker.currentConfig; - assert.deepStrictEqual(parsedConf.mappings, { My_Listener: ['My_Consumer'] }); + assert.deepStrictEqual(parsedConf.mappings, { 'f5telemetry_default::My_Listener': ['f5telemetry_default::My_Consumer'] }); assert.lengthOf(parsedConf.components, 3); configUtil.removeComponents(parsedConf); @@ -320,13 +320,13 @@ describe('Config Util', () => { .then(() => { const parsedConf = configWorker.currentConfig; assert.deepStrictEqual(parsedConf.mappings, { - My_Listener: ['My_Consumer', 'My_Consumer_2', 'My_Consumer_3'], + 'f5telemetry_default::My_Listener': ['f5telemetry_default::My_Consumer', 'f5telemetry_default::My_Consumer_2', 'f5telemetry_default::My_Consumer_3'], 'My_Namespace::My_Listener': ['My_Namespace::My_Consumer'] }); configUtil.removeComponents(parsedConf, { filter: c => c.name === 'My_Consumer' }); assert.deepStrictEqual(parsedConf.mappings, { - My_Listener: ['My_Consumer_2', 'My_Consumer_3'] + 'f5telemetry_default::My_Listener': ['f5telemetry_default::My_Consumer_2', 'f5telemetry_default::My_Consumer_3'] }); assert.lengthOf(configUtil.getTelemetryListeners(parsedConf), 2); assert.lengthOf(configUtil.getTelemetryConsumers(parsedConf), 2); diff --git a/test/unit/utils/metadataTests.js b/test/unit/utils/metadataTests.js index 6cd5a999..6c91f107 100644 --- a/test/unit/utils/metadataTests.js +++ b/test/unit/utils/metadataTests.js @@ -17,6 +17,7 @@ const chaiAsPromised = require('chai-as-promised'); const sinon = require('sinon'); const azureUtil = require('../../../src/lib/consumers/shared/azureUtil'); +const gcpUtil = require('../../../src/lib/consumers/shared/gcpUtil'); const metadataUtil = require('../../../src/lib/utils/metadata'); chai.use(chaiAsPromised); @@ -28,7 +29,7 @@ describe('Metadata Util', () => { }); describe('.getInstanceMetadata', () => { - const sampleAzure = { + const azureMetadata = { compute: { azEnvironment: 'AZUREPUBLICCLOUD', location: 'westus', @@ -54,8 +55,22 @@ describe('Metadata Util', () => { } }; - it('should return metadata available for applicable consumer(s)', () => { - sinon.stub(azureUtil, 'getInstanceMetadata').resolves(sampleAzure); + const googleMetadata = { + attributes: {}, + cpuPlatform: 'Intel Broadwell', + description: '', + hostname: 'myHost.a.project.internal', + id: 12345678, + image: 'projects/ubuntu-os-cloud/global/images/ubuntu', + machineType: 'projects/1234/machineTypes/n1-standard-1', + maintenanceEvent: 'NONE', + name: 'myHost', + tags: [], + zone: 'projects/1234/zones/us-west1-b' + }; + + it('should return metadata available for applicable consumer (Azure Log Analytics)', () => { + sinon.stub(azureUtil, 'getInstanceMetadata').resolves(azureMetadata); const mockConsumer = { config: { type: 'Azure_Log_Analytics' @@ -63,7 +78,20 @@ describe('Metadata Util', () => { }; return metadataUtil.getInstanceMetadata(mockConsumer) .then((metadata) => { - assert.deepStrictEqual(metadata, sampleAzure); + assert.deepStrictEqual(metadata, azureMetadata); + }); + }); + + it('should return metadata available for applicable consumer (Google Cloud Monitoring)', () => { + sinon.stub(gcpUtil, 'getInstanceMetadata').resolves(googleMetadata); + const mockConsumer = { + config: { + type: 'Google_Cloud_Monitoring' + } + }; + return metadataUtil.getInstanceMetadata(mockConsumer) + .then((metadata) => { + assert.deepStrictEqual(metadata, googleMetadata); }); }); @@ -99,7 +127,7 @@ describe('Metadata Util', () => { const apiCallStub = sinon.stub(azureUtil, 'getInstanceMetadata'); apiCallStub.onCall(0).rejects({ message: 'Let\'s say this failed' }); apiCallStub.onCall(1).rejects({ message: 'Let\'s say this failed yet again' }); - apiCallStub.onCall(2).resolves(sampleAzure); + apiCallStub.onCall(2).resolves(azureMetadata); const mockConsumer = { config: { type: 'Azure_Log_Analytics' diff --git a/test/unit/utils/tracerTests.js b/test/unit/utils/tracerTests.js index 4073c174..7d44073e 100644 --- a/test/unit/utils/tracerTests.js +++ b/test/unit/utils/tracerTests.js @@ -709,7 +709,7 @@ describe('Tracer', () => { const registered = tracer.registered(); assert.sameDeepMembers( registered.map(t => t.path), - ['/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', 'listener'], + ['/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', 'listener'], 'should configure destination as expected' ); return configWorker.processDeclaration({ class: 'Telemetry' }) @@ -748,7 +748,7 @@ describe('Tracer', () => { const registered = tracer.registered(); assert.sameDeepMembers( registered.map(t => t.path), - ['/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', 'listener'], + ['/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', 'listener'], 'should configure destination as expected' ); return configWorker.processDeclaration({ @@ -781,7 +781,7 @@ describe('Tracer', () => { assert.sameDeepMembers( tracer.registered().map(t => t.path), [ - '/var/tmp/telemetry/Telemetry_System_Poller.My_Enabled_Poller_With_Disabled_Trace::My_Enabled_Poller_With_Disabled_Trace', + '/var/tmp/telemetry/Telemetry_System_Poller.f5telemetry_default::My_Enabled_Poller_With_Disabled_Trace::My_Enabled_Poller_With_Disabled_Trace', 'listener2' ], 'should configure destination as expected' @@ -818,7 +818,7 @@ describe('Tracer', () => { const registered = tracer.registered(); // remember those instances - should survive all updates assert.sameDeepMembers( registered.map(t => t.path), - ['/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', 'listener'], + ['/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', 'listener'], 'should configure destination as expected' ); return configWorker.processNamespaceDeclaration({ @@ -843,7 +843,7 @@ describe('Tracer', () => { assert.sameDeepMembers( tracer.registered().map(t => t.path), [ - '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', 'listener', '/var/tmp/telemetry/Telemetry_Consumer.Namespace::My_Consumer', 'listener2' @@ -872,7 +872,7 @@ describe('Tracer', () => { assert.sameDeepMembers( tracer.registered().map(t => t.path), [ - '/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', + '/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', 'listener', 'listener2' ], @@ -889,7 +889,7 @@ describe('Tracer', () => { }); assert.sameDeepMembers( tracer.registered().map(t => t.path), - ['/var/tmp/telemetry/Telemetry_Consumer.My_Consumer', 'listener'], + ['/var/tmp/telemetry/Telemetry_Consumer.f5telemetry_default::My_Consumer', 'listener'], 'should configure destination as expected' ); })); diff --git a/versions.json b/versions.json new file mode 100644 index 00000000..c74fce65 --- /dev/null +++ b/versions.json @@ -0,0 +1,10 @@ +{ + "versionMetaTimestamp": 1540928503, + "latestVersion": { + "name": "1.22 (non-LTS)", + "url": "/products/extensions/f5-telemetry/latest/" + }, + "otherVersions": [ + { "name": "1.20.1 (LTS)", "url": "/products/extensions/f5-telemetry/1.20/"} + ] +} \ No newline at end of file