From 3453f4fe86871ee5cf11231999d9e157d2906c12 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 20 Feb 2024 13:49:22 -0500 Subject: [PATCH 01/43] argo-rollouts WIP --- argo_rollouts/CHANGELOG.md | 4 ++ argo_rollouts/README.md | 55 +++++++++++++++++ argo_rollouts/assets/configuration/spec.yaml | 10 ++++ .../dashboards/argo_rollouts_overview.json | 0 argo_rollouts/assets/service_checks.json | 1 + argo_rollouts/changelog.d/1.added | 1 + argo_rollouts/datadog_checks/__init__.py | 4 ++ .../datadog_checks/argo_rollouts/__about__.py | 4 ++ .../datadog_checks/argo_rollouts/__init__.py | 7 +++ .../datadog_checks/argo_rollouts/check.py | 29 +++++++++ .../argo_rollouts/config_models/__init__.py | 25 ++++++++ .../argo_rollouts/config_models/defaults.py | 16 +++++ .../argo_rollouts/config_models/instance.py | 51 ++++++++++++++++ .../argo_rollouts/config_models/shared.py | 48 +++++++++++++++ .../argo_rollouts/config_models/validators.py | 13 ++++ .../argo_rollouts/data/conf.yaml.example | 44 ++++++++++++++ .../datadog_checks/argo_rollouts/metrics.py | 0 argo_rollouts/hatch.toml | 4 ++ argo_rollouts/images/IMAGES_README.md | 46 ++++++++++++++ argo_rollouts/manifest.json | 56 +++++++++++++++++ argo_rollouts/metadata.csv | 1 + argo_rollouts/pyproject.toml | 60 +++++++++++++++++++ argo_rollouts/tests/__init__.py | 3 + argo_rollouts/tests/conftest.py | 14 +++++ argo_rollouts/tests/test_unit.py | 26 ++++++++ 25 files changed, 522 insertions(+) create mode 100644 argo_rollouts/CHANGELOG.md create mode 100644 argo_rollouts/README.md create mode 100644 argo_rollouts/assets/configuration/spec.yaml create mode 100644 argo_rollouts/assets/dashboards/argo_rollouts_overview.json create mode 100644 argo_rollouts/assets/service_checks.json create mode 100644 argo_rollouts/changelog.d/1.added create mode 100644 argo_rollouts/datadog_checks/__init__.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/__about__.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/__init__.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/check.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/config_models/validators.py create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example create mode 100644 argo_rollouts/datadog_checks/argo_rollouts/metrics.py create mode 100644 argo_rollouts/hatch.toml create mode 100644 argo_rollouts/images/IMAGES_README.md create mode 100644 argo_rollouts/manifest.json create mode 100644 argo_rollouts/metadata.csv create mode 100644 argo_rollouts/pyproject.toml create mode 100644 argo_rollouts/tests/__init__.py create mode 100644 argo_rollouts/tests/conftest.py create mode 100644 argo_rollouts/tests/test_unit.py diff --git a/argo_rollouts/CHANGELOG.md b/argo_rollouts/CHANGELOG.md new file mode 100644 index 0000000000000..c287588eabeb3 --- /dev/null +++ b/argo_rollouts/CHANGELOG.md @@ -0,0 +1,4 @@ +# CHANGELOG - Argo_Rollouts + + + diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md new file mode 100644 index 0000000000000..0259d4e7807ae --- /dev/null +++ b/argo_rollouts/README.md @@ -0,0 +1,55 @@ +# Agent Check: Argo_Rollouts + +## Overview + +This check monitors [Argo_Rollouts][1] through the Datadog Agent. + +## Setup + +Follow the instructions below to install and configure this check for an Agent running on a host. For containerized environments, see the [Autodiscovery Integration Templates][3] for guidance on applying these instructions. + +### Installation + +The Argo_Rollouts check is included in the [Datadog Agent][2] package. +No additional installation is needed on your server. + +### Configuration + +1. Edit the `argo_rollouts.d/conf.yaml` file, in the `conf.d/` folder at the root of your Agent's configuration directory to start collecting your argo_rollouts performance data. See the [sample argo_rollouts.d/conf.yaml][4] for all available configuration options. + +2. [Restart the Agent][5]. + +### Validation + +[Run the Agent's status subcommand][6] and look for `argo_rollouts` under the Checks section. + +## Data Collected + +### Metrics + +See [metadata.csv][7] for a list of metrics provided by this integration. + +### Events + +The Argo_Rollouts integration does not include any events. + +### Service Checks + +The Argo_Rollouts integration does not include any service checks. + +See [service_checks.json][8] for a list of service checks provided by this integration. + +## Troubleshooting + +Need help? Contact [Datadog support][9]. + + +[1]: **LINK_TO_INTEGRATION_SITE** +[2]: https://app.datadoghq.com/account/settings/agent/latest +[3]: https://docs.datadoghq.com/agent/kubernetes/integrations/ +[4]: https://github.com/DataDog/integrations-core/blob/master/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example +[5]: https://docs.datadoghq.com/agent/guide/agent-commands/#start-stop-and-restart-the-agent +[6]: https://docs.datadoghq.com/agent/guide/agent-commands/#agent-status-and-information +[7]: https://github.com/DataDog/integrations-core/blob/master/argo_rollouts/metadata.csv +[8]: https://github.com/DataDog/integrations-core/blob/master/argo_rollouts/assets/service_checks.json +[9]: https://docs.datadoghq.com/help/ diff --git a/argo_rollouts/assets/configuration/spec.yaml b/argo_rollouts/assets/configuration/spec.yaml new file mode 100644 index 0000000000000..9e3b639e546e5 --- /dev/null +++ b/argo_rollouts/assets/configuration/spec.yaml @@ -0,0 +1,10 @@ +name: Argo_Rollouts +files: +- name: argo_rollouts.yaml + options: + - template: init_config + options: + - template: init_config/default + - template: instances + options: + - template: instances/default diff --git a/argo_rollouts/assets/dashboards/argo_rollouts_overview.json b/argo_rollouts/assets/dashboards/argo_rollouts_overview.json new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/argo_rollouts/assets/service_checks.json b/argo_rollouts/assets/service_checks.json new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/argo_rollouts/assets/service_checks.json @@ -0,0 +1 @@ +[] diff --git a/argo_rollouts/changelog.d/1.added b/argo_rollouts/changelog.d/1.added new file mode 100644 index 0000000000000..aa949b47b7b41 --- /dev/null +++ b/argo_rollouts/changelog.d/1.added @@ -0,0 +1 @@ +Initial Release \ No newline at end of file diff --git a/argo_rollouts/datadog_checks/__init__.py b/argo_rollouts/datadog_checks/__init__.py new file mode 100644 index 0000000000000..1517d901c0aae --- /dev/null +++ b/argo_rollouts/datadog_checks/__init__.py @@ -0,0 +1,4 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore diff --git a/argo_rollouts/datadog_checks/argo_rollouts/__about__.py b/argo_rollouts/datadog_checks/argo_rollouts/__about__.py new file mode 100644 index 0000000000000..acbfd1c866b84 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/__about__.py @@ -0,0 +1,4 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +__version__ = '1.0.0' diff --git a/argo_rollouts/datadog_checks/argo_rollouts/__init__.py b/argo_rollouts/datadog_checks/argo_rollouts/__init__.py new file mode 100644 index 0000000000000..ab930c899a7c9 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/__init__.py @@ -0,0 +1,7 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +from .__about__ import __version__ +from .check import ArgoRolloutsCheck + +__all__ = ['__version__', 'ArgoRolloutsCheck'] diff --git a/argo_rollouts/datadog_checks/argo_rollouts/check.py b/argo_rollouts/datadog_checks/argo_rollouts/check.py new file mode 100644 index 0000000000000..9963d5c8f348f --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/check.py @@ -0,0 +1,29 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +from typing import Any # noqa: F401 + +from datadog_checks.base import AgentCheck # noqa: F401 + +# from datadog_checks.base.utils.db import QueryManager +# from requests.exceptions import ConnectionError, HTTPError, InvalidURL, Timeout +# from json import JSONDecodeError + + +class ArgoRolloutsCheck(AgentCheck): + DEFAULT_METRIC_LIMIT = 0 + __NAMESPACE__ = 'argo_rollouts' + + def __init__(self, name, init_config, instances=None): + + super(ArgoRolloutsCheck, self).__init__( + name, + init_config, + instances, + ) + + def get_default_config(self): + return { + 'metrics': [METRIC_MAP], + "rename_labels": RENAME_LABELS_MAP, + } \ No newline at end of file diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py new file mode 100644 index 0000000000000..2e7eff5e94dd7 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py @@ -0,0 +1,25 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) + +# This file is autogenerated. +# To change this file you should edit assets/configuration/spec.yaml and then run the following commands: +# ddev -x validate config -s +# ddev -x validate models -s + + +from .instance import InstanceConfig +from .shared import SharedConfig + + +class ConfigMixin: + _config_model_instance: InstanceConfig + _config_model_shared: SharedConfig + + @property + def config(self) -> InstanceConfig: + return self._config_model_instance + + @property + def shared_config(self) -> SharedConfig: + return self._config_model_shared diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py new file mode 100644 index 0000000000000..7adf7c7b7abd3 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py @@ -0,0 +1,16 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) + +# This file is autogenerated. +# To change this file you should edit assets/configuration/spec.yaml and then run the following commands: +# ddev -x validate config -s +# ddev -x validate models -s + + +def instance_empty_default_hostname(): + return False + + +def instance_min_collection_interval(): + return 15 diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py new file mode 100644 index 0000000000000..b2d32d2e62ea8 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py @@ -0,0 +1,51 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) + +# This file is autogenerated. +# To change this file you should edit assets/configuration/spec.yaml and then run the following commands: +# ddev -x validate config -s +# ddev -x validate models -s + + +from __future__ import annotations + +from typing import Optional + +from pydantic import BaseModel, ConfigDict, field_validator, model_validator + +from datadog_checks.base.utils.functions import identity +from datadog_checks.base.utils.models import validation + +from . import defaults, validators + + +class InstanceConfig(BaseModel): + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + empty_default_hostname: Optional[bool] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None + + @model_validator(mode='before') + def _initial_validation(cls, values): + return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) + + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() + + return validation.utils.make_immutable(value) + + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py new file mode 100644 index 0000000000000..656c417aa3849 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py @@ -0,0 +1,48 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) + +# This file is autogenerated. +# To change this file you should edit assets/configuration/spec.yaml and then run the following commands: +# ddev -x validate config -s +# ddev -x validate models -s + + +from __future__ import annotations + +from typing import Optional + +from pydantic import BaseModel, ConfigDict, field_validator, model_validator + +from datadog_checks.base.utils.functions import identity +from datadog_checks.base.utils.models import validation + +from . import defaults, validators + + +class SharedConfig(BaseModel): + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') + def _initial_validation(cls, values): + return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) + + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() + + return validation.utils.make_immutable(value) + + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/validators.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/validators.py new file mode 100644 index 0000000000000..70150e85e6124 --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/validators.py @@ -0,0 +1,13 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) + +# Here you can include additional config validators or transformers +# +# def initialize_instance(values, **kwargs): +# if 'my_option' not in values and 'my_legacy_option' in values: +# values['my_option'] = values['my_legacy_option'] +# if values.get('my_number') > 10: +# raise ValueError('my_number max value is 10, got %s' % str(values.get('my_number'))) +# +# return values diff --git a/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example b/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example new file mode 100644 index 0000000000000..8ee633b1335fc --- /dev/null +++ b/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example @@ -0,0 +1,44 @@ +## All options defined here are available to all instances. +# +init_config: + + ## @param service - string - optional + ## Attach the tag `service:` to every metric, event, and service check emitted by this integration. + ## + ## Additionally, this sets the default `service` for every log source. + # + # service: + +## Every instance is scheduled independently of the others. +# +instances: + + - + ## @param tags - list of strings - optional + ## A list of tags to attach to every metric and service check emitted by this instance. + ## + ## Learn more about tagging at https://docs.datadoghq.com/tagging + # + # tags: + # - : + # - : + + ## @param service - string - optional + ## Attach the tag `service:` to every metric, event, and service check emitted by this integration. + ## + ## Overrides any `service` defined in the `init_config` section. + # + # service: + + ## @param min_collection_interval - number - optional - default: 15 + ## This changes the collection interval of the check. For more information, see: + ## https://docs.datadoghq.com/developers/write_agent_check/#collection-interval + # + # min_collection_interval: 15 + + ## @param empty_default_hostname - boolean - optional - default: false + ## This forces the check to send metrics with no hostname. + ## + ## This is useful for cluster-level checks. + # + # empty_default_hostname: false diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/argo_rollouts/hatch.toml b/argo_rollouts/hatch.toml new file mode 100644 index 0000000000000..001e43ce25414 --- /dev/null +++ b/argo_rollouts/hatch.toml @@ -0,0 +1,4 @@ +[env.collectors.datadog-checks] + +[[envs.default.matrix]] +python = ["3.11"] diff --git a/argo_rollouts/images/IMAGES_README.md b/argo_rollouts/images/IMAGES_README.md new file mode 100644 index 0000000000000..c915b722acace --- /dev/null +++ b/argo_rollouts/images/IMAGES_README.md @@ -0,0 +1,46 @@ +# Marketplace Media Carousel Guidelines + +## Using the media gallery + +To use the media gallery, you must upload a minimum of one image. The gallery +can hold a maximum of 8 pieces of media total, and one of these pieces of media +can be a video (guidelines and submission steps below). Images should be +added to your /images directory and referenced in the manifest.json file. + + +## Image and video requirements + +### Images + +``` +File type : .jpg or .png +File size : ~500 KB per image, with a max of 1 MB per image +File dimensions : The aspect ratio must be 16:9 minimum, with these constraints: + + Width: 1440px + Min height: 810px + Max height: 2560px + +File name : Use only letters, numbers, underscores, and hyphens +Color mode : RGB +Color profile : sRGB +Description : 300 characters maximum +``` + +### Video + +To display a video in your media gallery, please send our team the zipped file +or a link to download the video at `marketplace@datadog.com`. In addition, +please upload a thumbnail image for your video as a part of the pull request. +Once approved, we will upload the file to Vimeo and provide you with the +vimeo_id to add to your manifest.json file. Please note that the gallery can +only hold one video. + +``` +File type : MP4 H.264 +File size : Max 1 video; 1 GB maximum size +File dimensions : The aspect ratio must be exactly 16:9, and the resolution must be 1920x1080 or higher +File name : partnerName-appName.mp4 +Run time : Recommendation of 60 seconds or less +Description : 300 characters maximum +``` diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json new file mode 100644 index 0000000000000..236ccae45b264 --- /dev/null +++ b/argo_rollouts/manifest.json @@ -0,0 +1,56 @@ +{ + "manifest_version": "2.0.0", + "app_uuid": "28d531ac-954c-4c5a-8769-589589f793e0", + "app_id": "argo-rollouts", + "display_on_public_website": false, + "tile": { + "overview": "README.md#Overview", + "configuration": "README.md#Setup", + "support": "README.md#Support", + "changelog": "CHANGELOG.md", + "description": "", + "title": "Argo_Rollouts", + "media": [], + "classifier_tags": [ + "Supported OS::Linux", + "Supported OS::Windows", + "Supported OS::macOS", + "Category::Metrics", + "Category::Kubernetes", + "Category::Log Collection", + "Submitted Data Type::Metrics", + "Submitted Data Type::Logs" + ] + }, + "assets": { + "integration": { + "auto_install": true, + "source_type_id": 8465752, + "source_type_name": "Argo_Rollouts", + "configuration": { + "spec": "assets/configuration/spec.yaml" + }, + "events": { + "creates_events": false + }, + "metrics": { + "prefix": "argo_rollouts.", + "check": "", + "metadata_path": "metadata.csv" + }, + "service_checks": { + "metadata_path": "assets/service_checks.json" + } + }, + "dashboards": {}, + "monitors": {}, + "logs": {}, + "saved_views": {} + }, + "author": { + "support_email": "help@datadoghq.com", + "name": "Datadog", + "homepage": "https://www.datadoghq.com", + "sales_email": "info@datadoghq.com" + }, +} diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv new file mode 100644 index 0000000000000..6bcfec7d94d0c --- /dev/null +++ b/argo_rollouts/metadata.csv @@ -0,0 +1 @@ +metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric diff --git a/argo_rollouts/pyproject.toml b/argo_rollouts/pyproject.toml new file mode 100644 index 0000000000000..3a597144bf738 --- /dev/null +++ b/argo_rollouts/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = [ + "hatchling>=0.13.0", +] +build-backend = "hatchling.build" + +[project] +name = "datadog-argo-rollouts" +description = "The Argo_Rollouts check" +readme = "README.md" +license = "BSD-3-Clause" +requires-python = ">=3.9" +keywords = [ + "datadog", + "datadog agent", + "datadog check", + "argo_rollouts", +] +authors = [ + { name = "Datadog", email = "packages@datadoghq.com" }, +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: BSD License", + "Private :: Do Not Upload", + "Programming Language :: Python :: 3.11", + "Topic :: System :: Monitoring", +] +dependencies = [ + "datadog-checks-base>=32.6.0", +] +dynamic = [ + "version", +] + +[project.optional-dependencies] +deps = [] + +[project.urls] +Source = "https://github.com/DataDog/integrations-core" + +[tool.hatch.version] +path = "datadog_checks/argo_rollouts/__about__.py" + +[tool.hatch.build.targets.sdist] +include = [ + "/datadog_checks", + "/tests", + "/manifest.json", +] + +[tool.hatch.build.targets.wheel] +include = [ + "/datadog_checks/argo_rollouts", +] +dev-mode-dirs = [ + ".", +] diff --git a/argo_rollouts/tests/__init__.py b/argo_rollouts/tests/__init__.py new file mode 100644 index 0000000000000..9103122bf028d --- /dev/null +++ b/argo_rollouts/tests/__init__.py @@ -0,0 +1,3 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) diff --git a/argo_rollouts/tests/conftest.py b/argo_rollouts/tests/conftest.py new file mode 100644 index 0000000000000..c8ac597a9862c --- /dev/null +++ b/argo_rollouts/tests/conftest.py @@ -0,0 +1,14 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +import pytest + + +@pytest.fixture(scope='session') +def dd_environment(): + yield + + +@pytest.fixture +def instance(): + return {} diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py new file mode 100644 index 0000000000000..cd26e7f3fa984 --- /dev/null +++ b/argo_rollouts/tests/test_unit.py @@ -0,0 +1,26 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) + +from typing import Any, Callable, Dict # noqa: F401 + +from datadog_checks.base import AgentCheck # noqa: F401 +from datadog_checks.base.stubs.aggregator import AggregatorStub # noqa: F401 +from datadog_checks.dev.utils import get_metadata_metrics +from datadog_checks.argo_rollouts import ArgoRolloutsCheck + + +def test_check(dd_run_check, aggregator, instance): + # type: (Callable[[AgentCheck, bool], None], AggregatorStub, Dict[str, Any]) -> None + check = ArgoRolloutsCheck('argo_rollouts', {}, [instance]) + dd_run_check(check) + + aggregator.assert_all_metrics_covered() + aggregator.assert_metrics_using_metadata(get_metadata_metrics()) + + +def test_emits_critical_service_check_when_service_is_down(dd_run_check, aggregator, instance): + # type: (Callable[[AgentCheck, bool], None], AggregatorStub, Dict[str, Any]) -> None + check = ArgoRolloutsCheck('argo_rollouts', {}, [instance]) + dd_run_check(check) + aggregator.assert_service_check('argo_rollouts.can_connect', ArgoRolloutsCheck.CRITICAL) From 00397b7c89a183c3b094fc9968fd178dae57ef88 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 27 Feb 2024 14:25:29 -0500 Subject: [PATCH 02/43] add working env --- argo_rollouts/assets/configuration/spec.yaml | 10 +- .../datadog_checks/argo_rollouts/check.py | 12 +- .../argo_rollouts/data/conf.yaml.example | 584 +- .../datadog_checks/argo_rollouts/metrics.py | 69 + argo_rollouts/hatch.toml | 9 + argo_rollouts/manifest.json | 2 +- argo_rollouts/tests/conftest.py | 28 +- argo_rollouts/tests/fixtures/openmetrics.txt | 407 + .../tests/kind/argo_rollouts_install.yaml | 15495 ++++++++++++++++ argo_rollouts/tests/test_e2e.py | 9 + 10 files changed, 16611 insertions(+), 14 deletions(-) create mode 100644 argo_rollouts/tests/fixtures/openmetrics.txt create mode 100644 argo_rollouts/tests/kind/argo_rollouts_install.yaml create mode 100644 argo_rollouts/tests/test_e2e.py diff --git a/argo_rollouts/assets/configuration/spec.yaml b/argo_rollouts/assets/configuration/spec.yaml index 9e3b639e546e5..608c831275927 100644 --- a/argo_rollouts/assets/configuration/spec.yaml +++ b/argo_rollouts/assets/configuration/spec.yaml @@ -4,7 +4,13 @@ files: options: - template: init_config options: - - template: init_config/default + - template: init_config/openmetrics - template: instances options: - - template: instances/default + - template: instances/openmetrics + overrides: + openmetrics_endpoint.required: true + openmetrics_endpoint.value.example: http://localhost:8090/metrics + openmetrics_endpoint.description: | + Endpoint exposing the Argo Rollouts Controller's Prometheus metrics. For more information refer to: + https://argo-rollouts.readthedocs.io/en/stable/features/controller-metrics/ \ No newline at end of file diff --git a/argo_rollouts/datadog_checks/argo_rollouts/check.py b/argo_rollouts/datadog_checks/argo_rollouts/check.py index 9963d5c8f348f..7a80116b9d6d2 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/check.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/check.py @@ -1,16 +1,12 @@ # (C) Datadog, Inc. 2024-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -from typing import Any # noqa: F401 +from datadog_checks.base import OpenMetricsBaseCheckV2 # noqa: F401 +from .metrics import METRIC_MAP, RENAME_LABELS_MAP -from datadog_checks.base import AgentCheck # noqa: F401 -# from datadog_checks.base.utils.db import QueryManager -# from requests.exceptions import ConnectionError, HTTPError, InvalidURL, Timeout -# from json import JSONDecodeError - -class ArgoRolloutsCheck(AgentCheck): +class ArgoRolloutsCheck(OpenMetricsBaseCheckV2): DEFAULT_METRIC_LIMIT = 0 __NAMESPACE__ = 'argo_rollouts' @@ -26,4 +22,4 @@ def get_default_config(self): return { 'metrics': [METRIC_MAP], "rename_labels": RENAME_LABELS_MAP, - } \ No newline at end of file + } diff --git a/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example b/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example index 8ee633b1335fc..5119a77c1500b 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example +++ b/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example @@ -2,6 +2,38 @@ # init_config: + ## @param proxy - mapping - optional + ## Set HTTP or HTTPS proxies for all instances. Use the `no_proxy` list + ## to specify hosts that must bypass proxies. + ## + ## The SOCKS protocol is also supported like so: + ## + ## socks5://user:pass@host:port + ## + ## Using the scheme `socks5` causes the DNS resolution to happen on the + ## client, rather than on the proxy server. This is in line with `curl`, + ## which uses the scheme to decide whether to do the DNS resolution on + ## the client or proxy. If you want to resolve the domains on the proxy + ## server, use `socks5h` as the scheme. + # + # proxy: + # http: http://: + # https: https://: + # no_proxy: + # - + # - + + ## @param skip_proxy - boolean - optional - default: false + ## If set to `true`, this makes the check bypass any proxy + ## settings enabled and attempt to reach services directly. + # + # skip_proxy: false + + ## @param timeout - number - optional - default: 10 + ## The timeout for connecting to services. + # + # timeout: 10 + ## @param service - string - optional ## Attach the tag `service:` to every metric, event, and service check emitted by this integration. ## @@ -13,7 +45,546 @@ init_config: # instances: - - + ## @param openmetrics_endpoint - string - required + ## Endpoint exposing the Argo Rollouts Controller's Prometheus metrics. For more information refer to: + ## https://argo-rollouts.readthedocs.io/en/stable/features/controller-metrics/ + # + - openmetrics_endpoint: http://localhost:8090/metrics + + ## @param raw_metric_prefix - string - optional + ## A prefix that is removed from all exposed metric names, if present. + ## All configuration options will use the prefix-less name. + # + # raw_metric_prefix: _ + + ## @param extra_metrics - (list of string or mapping) - optional + ## This list defines metrics to collect from the `openmetrics_endpoint`, in addition to + ## what the check collects by default. If the check already collects a metric, then + ## metric definitions here take precedence. Metrics may be defined in 3 ways: + ## + ## 1. If the item is a string, then it represents the exposed metric name, and + ## the sent metric name will be identical. For example: + ## + ## extra_metrics: + ## - + ## - + ## 2. If the item is a mapping, then the keys represent the exposed metric names. + ## + ## a. If a value is a string, then it represents the sent metric name. For example: + ## + ## extra_metrics: + ## - : + ## - : + ## b. If a value is a mapping, then it must have a `name` and/or `type` key. + ## The `name` represents the sent metric name, and the `type` represents how + ## the metric should be handled, overriding any type information the endpoint + ## may provide. For example: + ## + ## extra_metrics: + ## - : + ## name: + ## type: + ## - : + ## name: + ## type: + ## + ## The supported native types are `gauge`, `counter`, `histogram`, and `summary`. + ## + ## Note: To collect counter metrics with names ending in `_total`, specify the metric name without the `_total` + ## suffix. For example, to collect the counter metric `promhttp_metric_handler_requests_total`, specify + ## `promhttp_metric_handler_requests`. This submits to Datadog the metric name appended with `.count`. + ## For more information, see: + ## https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#suffixes + ## + ## Regular expressions may be used to match the exposed metric names, for example: + ## + ## extra_metrics: + ## - ^network_(ingress|egress)_.+ + ## - .+: + ## type: gauge + # + # extra_metrics: [] + + ## @param exclude_metrics - list of strings - optional + ## A list of metrics to exclude, with each entry being either + ## the exact metric name or a regular expression. + ## In order to exclude all metrics but the ones matching a specific filter, + ## you can use a negative lookahead regex like: + ## - ^(?!foo).*$ + # + # exclude_metrics: [] + + ## @param exclude_metrics_by_labels - mapping - optional + ## A mapping of labels to exclude metrics with matching label name and their corresponding metric values. To match + ## all values of a label, set it to `true`. + ## + ## Note: Label filtering happens before `rename_labels`. + ## + ## For example, the following configuration instructs the check to exclude all metrics with + ## a label `worker` or a label `pid` with the value of either `23` or `42`. + ## + ## exclude_metrics_by_labels: + ## worker: true + ## pid: + ## - '23' + ## - '42' + # + # exclude_metrics_by_labels: {} + + ## @param exclude_labels - list of strings - optional + ## A list of labels to exclude, useful for high cardinality values like timestamps or UUIDs. + ## May be used in conjunction with `include_labels`. + ## Labels defined in `exclude_labels` will take precedence in case of overlap. + ## + ## Note: Label filtering happens before `rename_labels`. + # + # exclude_labels: [] + + ## @param include_labels - list of strings - optional + ## A list of labels to include. May be used in conjunction with `exclude_labels`. + ## Labels defined in `exclude_labels` will take precedence in case of overlap. + ## + ## Note: Label filtering happens before `rename_labels`. + # + # include_labels: [] + + ## @param rename_labels - mapping - optional + ## A mapping of label names to their new names. + # + # rename_labels: + # : + # : + + ## @param enable_health_service_check - boolean - optional - default: true + ## Whether or not to send a service check named `.openmetrics.health` which reports + ## the health of the `openmetrics_endpoint`. + # + # enable_health_service_check: true + + ## @param ignore_connection_errors - boolean - optional - default: false + ## Whether or not to ignore connection errors when scraping `openmetrics_endpoint`. + # + # ignore_connection_errors: false + + ## @param hostname_label - string - optional + ## Override the hostname for every metric submission with the value of one of its labels. + # + # hostname_label: + + ## @param hostname_format - string - optional + ## When `hostname_label` is set, this instructs the check how to format the values. The string + ## `` is replaced by the value of the label defined by `hostname_label`. + # + # hostname_format: + + ## @param collect_histogram_buckets - boolean - optional - default: true + ## Whether or not to send histogram buckets. + # + # collect_histogram_buckets: true + + ## @param non_cumulative_histogram_buckets - boolean - optional - default: false + ## Whether or not histogram buckets are non-cumulative and to come with a `lower_bound` tag. + # + # non_cumulative_histogram_buckets: false + + ## @param histogram_buckets_as_distributions - boolean - optional - default: false + ## Whether or not to send histogram buckets as Datadog distribution metrics. This implicitly + ## enables the `collect_histogram_buckets` and `non_cumulative_histogram_buckets` options. + ## + ## Learn more about distribution metrics: + ## https://docs.datadoghq.com/developers/metrics/types/?tab=distribution#metric-types + # + # histogram_buckets_as_distributions: false + + ## @param collect_counters_with_distributions - boolean - optional - default: false + ## Whether or not to also collect the observation counter metrics ending in `.sum` and `.count` + ## when sending histogram buckets as Datadog distribution metrics. This implicitly enables the + ## `histogram_buckets_as_distributions` option. + # + # collect_counters_with_distributions: false + + ## @param use_process_start_time - boolean - optional - default: false + ## Whether to enable a heuristic for reporting counter values on the first scrape. When true, + ## the first time an endpoint is scraped, check `process_start_time_seconds` to decide whether zero + ## initial value can be assumed for counters. This requires keeping metrics in memory until the entire + ## response is received. + # + # use_process_start_time: false + + ## @param share_labels - mapping - optional + ## This mapping allows for the sharing of labels across multiple metrics. The keys represent the + ## exposed metrics from which to share labels, and the values are mappings that configure the + ## sharing behavior. Each mapping must have at least one of the following keys: + ## + ## labels - This is a list of labels to share. All labels are shared if this is not set. + ## match - This is a list of labels to match on other metrics as a condition for sharing. + ## values - This is a list of allowed values as a condition for sharing. + ## + ## To unconditionally share all labels of a metric, set it to `true`. + ## + ## For example, the following configuration instructs the check to apply all labels from `metric_a` + ## to all other metrics, the `node` label from `metric_b` to only those metrics that have a `pod` + ## label value that matches the `pod` label value of `metric_b`, and all labels from `metric_c` + ## to all other metrics if their value is equal to `23` or `42`. + ## + ## share_labels: + ## metric_a: true + ## metric_b: + ## labels: + ## - node + ## match: + ## - pod + ## metric_c: + ## values: + ## - 23 + ## - 42 + # + # share_labels: {} + + ## @param cache_shared_labels - boolean - optional - default: true + ## When `share_labels` is set, it instructs the check to cache labels collected from the first payload + ## for improved performance. + ## + ## Set this to `false` to compute label sharing for every payload at the risk of potentially increased memory usage. + # + # cache_shared_labels: true + + ## @param raw_line_filters - list of strings - optional + ## A list of regular expressions used to exclude lines read from the `openmetrics_endpoint` + ## from being parsed. + # + # raw_line_filters: [] + + ## @param cache_metric_wildcards - boolean - optional - default: true + ## Whether or not to cache data from metrics that are defined by regular expressions rather + ## than the full metric name. + # + # cache_metric_wildcards: true + + ## @param telemetry - boolean - optional - default: false + ## Whether or not to submit metrics prefixed by `.telemetry.` for debugging purposes. + # + # telemetry: false + + ## @param ignore_tags - list of strings - optional + ## A list of regular expressions used to ignore tags added by Autodiscovery and entries in the `tags` option. + # + # ignore_tags: + # - + # - + # - + + ## @param proxy - mapping - optional + ## This overrides the `proxy` setting in `init_config`. + ## + ## Set HTTP or HTTPS proxies for this instance. Use the `no_proxy` list + ## to specify hosts that must bypass proxies. + ## + ## The SOCKS protocol is also supported, for example: + ## + ## socks5://user:pass@host:port + ## + ## Using the scheme `socks5` causes the DNS resolution to happen on the + ## client, rather than on the proxy server. This is in line with `curl`, + ## which uses the scheme to decide whether to do the DNS resolution on + ## the client or proxy. If you want to resolve the domains on the proxy + ## server, use `socks5h` as the scheme. + # + # proxy: + # http: http://: + # https: https://: + # no_proxy: + # - + # - + + ## @param skip_proxy - boolean - optional - default: false + ## This overrides the `skip_proxy` setting in `init_config`. + ## + ## If set to `true`, this makes the check bypass any proxy + ## settings enabled and attempt to reach services directly. + # + # skip_proxy: false + + ## @param auth_type - string - optional - default: basic + ## The type of authentication to use. The available types (and related options) are: + ## + ## - basic + ## |__ username + ## |__ password + ## |__ use_legacy_auth_encoding + ## - digest + ## |__ username + ## |__ password + ## - ntlm + ## |__ ntlm_domain + ## |__ password + ## - kerberos + ## |__ kerberos_auth + ## |__ kerberos_cache + ## |__ kerberos_delegate + ## |__ kerberos_force_initiate + ## |__ kerberos_hostname + ## |__ kerberos_keytab + ## |__ kerberos_principal + ## - aws + ## |__ aws_region + ## |__ aws_host + ## |__ aws_service + ## + ## The `aws` auth type relies on boto3 to automatically gather AWS credentials, for example: from `.aws/credentials`. + ## Details: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html#configuring-credentials + # + # auth_type: basic + + ## @param use_legacy_auth_encoding - boolean - optional - default: true + ## When `auth_type` is set to `basic`, this determines whether to encode as `latin1` rather than `utf-8`. + # + # use_legacy_auth_encoding: true + + ## @param username - string - optional + ## The username to use if services are behind basic or digest auth. + # + # username: + + ## @param password - string - optional + ## The password to use if services are behind basic or NTLM auth. + # + # password: + + ## @param ntlm_domain - string - optional + ## If your services use NTLM authentication, specify + ## the domain used in the check. For NTLM Auth, append + ## the username to domain, not as the `username` parameter. + # + # ntlm_domain: \ + + ## @param kerberos_auth - string - optional - default: disabled + ## If your services use Kerberos authentication, you can specify the Kerberos + ## strategy to use between: + ## + ## - required + ## - optional + ## - disabled + ## + ## See https://github.com/requests/requests-kerberos#mutual-authentication + # + # kerberos_auth: disabled + + ## @param kerberos_cache - string - optional + ## Sets the KRB5CCNAME environment variable. + ## It should point to a credential cache with a valid TGT. + # + # kerberos_cache: + + ## @param kerberos_delegate - boolean - optional - default: false + ## Set to `true` to enable Kerberos delegation of credentials to a server that requests delegation. + ## + ## See https://github.com/requests/requests-kerberos#delegation + # + # kerberos_delegate: false + + ## @param kerberos_force_initiate - boolean - optional - default: false + ## Set to `true` to preemptively initiate the Kerberos GSS exchange and + ## present a Kerberos ticket on the initial request (and all subsequent). + ## + ## See https://github.com/requests/requests-kerberos#preemptive-authentication + # + # kerberos_force_initiate: false + + ## @param kerberos_hostname - string - optional + ## Override the hostname used for the Kerberos GSS exchange if its DNS name doesn't + ## match its Kerberos hostname, for example: behind a content switch or load balancer. + ## + ## See https://github.com/requests/requests-kerberos#hostname-override + # + # kerberos_hostname: + + ## @param kerberos_principal - string - optional + ## Set an explicit principal, to force Kerberos to look for a + ## matching credential cache for the named user. + ## + ## See https://github.com/requests/requests-kerberos#explicit-principal + # + # kerberos_principal: + + ## @param kerberos_keytab - string - optional + ## Set the path to your Kerberos key tab file. + # + # kerberos_keytab: + + ## @param auth_token - mapping - optional + ## This allows for the use of authentication information from dynamic sources. + ## Both a reader and writer must be configured. + ## + ## The available readers are: + ## + ## - type: file + ## path (required): The absolute path for the file to read from. + ## pattern: A regular expression pattern with a single capture group used to find the + ## token rather than using the entire file, for example: Your secret is (.+) + ## - type: oauth + ## url (required): The token endpoint. + ## client_id (required): The client identifier. + ## client_secret (required): The client secret. + ## basic_auth: Whether the provider expects credentials to be transmitted in + ## an HTTP Basic Auth header. The default is: false + ## options: Mapping of additional options to pass to the provider, such as the audience + ## or the scope. For example: + ## options: + ## audience: https://example.com + ## scope: read:example + ## + ## The available writers are: + ## + ## - type: header + ## name (required): The name of the field, for example: Authorization + ## value: The template value, for example `Bearer `. The default is: + ## placeholder: The substring in `value` to replace with the token, defaults to: + # + # auth_token: + # reader: + # type: + # : + # : + # writer: + # type: + # : + # : + + ## @param aws_region - string - optional + ## If your services require AWS Signature Version 4 signing, set the region. + ## + ## See https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html + # + # aws_region: + + ## @param aws_host - string - optional + ## If your services require AWS Signature Version 4 signing, set the host. + ## This only needs the hostname and does not require the protocol (HTTP, HTTPS, and more). + ## For example, if connecting to https://us-east-1.amazonaws.com/, set `aws_host` to `us-east-1.amazonaws.com`. + ## + ## Note: This setting is not necessary for official integrations. + ## + ## See https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html + # + # aws_host: + + ## @param aws_service - string - optional + ## If your services require AWS Signature Version 4 signing, set the service code. For a list + ## of available service codes, see https://docs.aws.amazon.com/general/latest/gr/rande.html + ## + ## Note: This setting is not necessary for official integrations. + ## + ## See https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html + # + # aws_service: + + ## @param tls_verify - boolean - optional - default: true + ## Instructs the check to validate the TLS certificate of services. + # + # tls_verify: true + + ## @param tls_use_host_header - boolean - optional - default: false + ## If a `Host` header is set, this enables its use for SNI (matching against the TLS certificate CN or SAN). + # + # tls_use_host_header: false + + ## @param tls_ignore_warning - boolean - optional - default: false + ## If `tls_verify` is disabled, security warnings are logged by the check. + ## Disable those by setting `tls_ignore_warning` to true. + # + # tls_ignore_warning: false + + ## @param tls_cert - string - optional + ## The path to a single file in PEM format containing a certificate as well as any + ## number of CA certificates needed to establish the certificate's authenticity for + ## use when connecting to services. It may also contain an unencrypted private key to use. + # + # tls_cert: + + ## @param tls_private_key - string - optional + ## The unencrypted private key to use for `tls_cert` when connecting to services. This is + ## required if `tls_cert` is set and it does not already contain a private key. + # + # tls_private_key: + + ## @param tls_ca_cert - string - optional + ## The path to a file of concatenated CA certificates in PEM format or a directory + ## containing several CA certificates in PEM format. If a directory, the directory + ## must have been processed using the c_rehash utility supplied with OpenSSL. See: + ## https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html + # + # tls_ca_cert: + + ## @param tls_protocols_allowed - list of strings - optional + ## The expected versions of TLS/SSL when fetching intermediate certificates. + ## Only `SSLv3`, `TLSv1.2`, `TLSv1.3` are allowed by default. The possible values are: + ## SSLv3 + ## TLSv1 + ## TLSv1.1 + ## TLSv1.2 + ## TLSv1.3 + # + # tls_protocols_allowed: + # - SSLv3 + # - TLSv1.2 + # - TLSv1.3 + + ## @param headers - mapping - optional + ## The headers parameter allows you to send specific headers with every request. + ## You can use it for explicitly specifying the host header or adding headers for + ## authorization purposes. + ## + ## This overrides any default headers. + # + # headers: + # Host: + # X-Auth-Token: + + ## @param extra_headers - mapping - optional + ## Additional headers to send with every request. + # + # extra_headers: + # Host: + # X-Auth-Token: + + ## @param timeout - number - optional - default: 10 + ## The timeout for accessing services. + ## + ## This overrides the `timeout` setting in `init_config`. + # + # timeout: 10 + + ## @param connect_timeout - number - optional + ## The connect timeout for accessing services. Defaults to `timeout`. + # + # connect_timeout: + + ## @param read_timeout - number - optional + ## The read timeout for accessing services. Defaults to `timeout`. + # + # read_timeout: + + ## @param request_size - number - optional - default: 16 + ## The number of kibibytes (KiB) to read from streaming HTTP responses at a time. + # + # request_size: 16 + + ## @param log_requests - boolean - optional - default: false + ## Whether or not to debug log the HTTP(S) requests made, including the method and URL. + # + # log_requests: false + + ## @param persist_connections - boolean - optional - default: false + ## Whether or not to persist cookies and use connection pooling for improved performance. + # + # persist_connections: false + + ## @param allow_redirects - boolean - optional - default: true + ## Whether or not to allow URL redirection. + # + # allow_redirects: true + ## @param tags - list of strings - optional ## A list of tags to attach to every metric and service check emitted by this instance. ## @@ -42,3 +613,14 @@ instances: ## This is useful for cluster-level checks. # # empty_default_hostname: false + + ## @param metric_patterns - mapping - optional + ## A mapping of metrics to include or exclude, with each entry being a regular expression. + ## + ## Metrics defined in `exclude` will take precedence in case of overlap. + # + # metric_patterns: + # include: + # - + # exclude: + # - diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index e69de29bb2d1d..f01c2e0713323 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -0,0 +1,69 @@ +METRIC_MAP = { + 'analysis_run_info': 'analysis.run.info', + 'analysis_run_metric_phase': 'analysis.run.metric.phase', + 'analysis_run_metric_type': 'analysis.run.metric.type', + 'analysis_run_phase': 'analysis.run.phase', + 'analysis_run_reconcile': 'analysis.run.reconcile', + 'analysis_run_reconcile_error': 'analysis.run.reconcile.error', + 'argo_rollouts_controller_info': 'conroller.info', + 'controller_clientset_k8s_request': 'controller.clientset.k8s.request', + 'experiment_info': 'experiment.info', + 'experiment_phase': 'experiment.phase', + 'experiment_reconcile': 'experiment.reconcile', + 'experiment_reconcile_error': 'experiment.reconcile.error', + 'go_gc_duration_seconds': 'go.gc.duration.seconds', + 'go_goroutines': 'go.goroutines', + 'go_info': 'go.info', + 'go_memstats_alloc_bytes': {'name': 'go.memstats.alloc_bytes', 'type': 'native_dynamic'}, + 'go_memstats_buck_hash_sys_bytes': 'go.memstats.buck.hash.sys.bytes', + 'go_memstats_frees': 'go.memstats.frees', + 'go_memstats_gc_sys_bytes': 'go.memstats.gc.sys.bytes', + 'go_memstats_heap_alloc_bytes': 'go.memstats.heap.alloc.bytes', + 'go_memstats_heap_idle_bytes': 'go.memstats.heap.idle.bytes', + 'go_memstats_heap_inuse_bytes': 'go.memstats.heap.inuse.byes', + 'go_memstats_heap_objects': 'go.memstats.heap.objects', + 'go_memstats_heap_released_bytes': 'go.memstats.heap.released.bytes', + 'go_memstats_heap_sys_bytes': 'go.memstats.heap.sys.bytes', + 'go_memstats_last_gc_time_seconds': 'go.memstats.last.gc.time.seconds', + 'go_memstats_lookups': 'go.memstats.lookups', + 'go_memstats_mallocs': 'go.memstats.mallocs', + 'go_memstats_mcache_inuse_bytes': 'go.memstats.mcache.inuse.bytes', + 'go_memstats_mcache_sys_bytes': 'go.memstats.mcache.sys.bytes', + 'go_memstats_mspan_inuse_bytes': 'go.memstats.mspan.inuse.bytes', + 'go_memstats_mspan_sys_bytes': 'go.memstats.mspan.sys.bytes', + 'go_memstats_next_gc_bytes': 'go.memstats.next.gc.bytes', + 'go_memstats_other_sys_bytes': 'go.memstats.other.sys.bytes', + 'go_memstats_stack_inuse_bytes': 'go.memstats.stack.inuse.bytes', + 'go_memstats_stack_sys_bytes': 'go.memstats.stack.sys.bytes', + 'go_memstats_sys_bytes': 'go.memstats.sys.bytes', + 'go_threads': 'go.threads', + 'notification_send': 'notification.send', + 'process_cpu_seconds': 'process.cpu.seconds', + 'process_max_fds': 'process.max.fds', + 'process_open_fds': 'process.open.fds', + 'process_resident_memory_bytes': 'process.resident.memory.bytes', + 'process_start_time_seconds': 'process.start.time.seconds', + 'process_virtual_memory_bytes': 'process.virtual.memory.bytes', + 'process_virtual_memory_max_bytes': 'process.virtual.memory.max.bytes', + 'rollout_events': 'rollout.events', + 'rollout_info': 'rollout.info', + 'rollout_info_replicas_available': 'rollout.info.replicas.available', + 'rollout_info_replicas_desired': 'rollout.info.replicas.desired', + 'rollout_info_replicas_unavailable': 'rollout.info.replicas.unavailable', + 'rollout_info_replicas_updated': 'rollout.info.replicas.updated', + 'rollout_phase': 'rollout.phase', + 'rollout_reconcile': 'rollout.reconcile', + 'rollout_reconcile_error': 'rollout.reconcile.error', + 'workqueue_adds': 'workqueue.adds', + 'workqueue_depth': 'workqueue.depth', + 'workqueue_longest_running_processor_seconds': 'workqueue.longest.running.processor.seconds', + 'workqueue_queue_duration_seconds': 'workqueue.queue.duration.seconds', + 'workqueue_retries': 'workqueue.retries', + 'workqueue_unfinished_work_seconds': 'workqueue.unfinished.work.seconds', + 'workqueue_work_duration_seconds': 'workqueue.work.duration.seconds' +} + +RENAME_LABELS_MAP = { + "name": "argo_rollout_name", + 'namespace': 'argo_rollout_namespace', +} \ No newline at end of file diff --git a/argo_rollouts/hatch.toml b/argo_rollouts/hatch.toml index 001e43ce25414..777aac7b7ec9e 100644 --- a/argo_rollouts/hatch.toml +++ b/argo_rollouts/hatch.toml @@ -1,4 +1,13 @@ [env.collectors.datadog-checks] +[envs.default.env-vars] +DDEV_SKIP_GENERIC_TAGS_CHECK = "true" + [[envs.default.matrix]] python = ["3.11"] +version = ["1.6.6"] + +[envs.default.overrides] +matrix.version.env-vars = "ARGO_ROLLOUT_VERSION" + +[envs.bench] \ No newline at end of file diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index 236ccae45b264..32758db95a10f 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -52,5 +52,5 @@ "name": "Datadog", "homepage": "https://www.datadoghq.com", "sales_email": "info@datadoghq.com" - }, + } } diff --git a/argo_rollouts/tests/conftest.py b/argo_rollouts/tests/conftest.py index c8ac597a9862c..533f020aed360 100644 --- a/argo_rollouts/tests/conftest.py +++ b/argo_rollouts/tests/conftest.py @@ -1,12 +1,36 @@ # (C) Datadog, Inc. 2024-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) +import os +from contextlib import ExitStack + import pytest +from datadog_checks.dev import get_here +from datadog_checks.dev.kind import kind_run +from datadog_checks.dev.kube_port_forward import port_forward +from datadog_checks.dev.subprocess import run_command + +HERE = get_here() + +def setup_argo_rollouts(): + run_command(['kubectl', 'create', 'ns', 'argo-rollouts']) + run_command(['kubectl', 'apply', '-f', os.path.join(HERE, 'kind', 'argo_rollouts_install.yaml'), '-n', 'argo-rollouts']) + + # Tries to ensure that the Kubernetes resources are deployed and ready before we do anything else + run_command(['kubectl', 'rollout', 'status', 'deployment/argo-rollouts', '-n', 'argo-rollouts']) + run_command(['kubectl', 'wait', 'pods', '--all', '-n', 'argo-rollouts', '--for=condition=Ready', '--timeout=600s']) + @pytest.fixture(scope='session') -def dd_environment(): - yield +def dd_environment(dd_save_state): + with kind_run(conditions=[setup_argo_rollouts], sleep=30) as kubeconfig, ExitStack() as stack: + argo_rollouts_host, argo_rollouts_port = stack.enter_context( + port_forward(kubeconfig, 'argo-rollouts', 8090, 'deployment', 'argo-rollouts') + ) + instances = [{'openmetrics_endpoint': f'http://{argo_rollouts_host}:{argo_rollouts_port}/metrics'}] + + yield {'instances': instances} @pytest.fixture diff --git a/argo_rollouts/tests/fixtures/openmetrics.txt b/argo_rollouts/tests/fixtures/openmetrics.txt new file mode 100644 index 0000000000000..7efdf9ca294ab --- /dev/null +++ b/argo_rollouts/tests/fixtures/openmetrics.txt @@ -0,0 +1,407 @@ +# HELP argo_rollouts_controller_info Running Argo-rollouts version +# TYPE argo_rollouts_controller_info gauge +argo_rollouts_controller_info{version="v1.6.4+a312af9"} 1 +# HELP controller_clientset_k8s_request_total Number of kubernetes requests executed during application reconciliation. +# TYPE controller_clientset_k8s_request_total counter +controller_clientset_k8s_request_total{kind="analysisruns",name="",namespace="",status_code="200",verb="Watch"} 4192 +controller_clientset_k8s_request_total{kind="analysisruns",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="analysistemplates",name="",namespace="",status_code="200",verb="Watch"} 4212 +controller_clientset_k8s_request_total{kind="analysistemplates",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="clusteranalysistemplates",name="",namespace="",status_code="200",verb="Watch"} 4208 +controller_clientset_k8s_request_total{kind="clusteranalysistemplates",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="configmaps",name="N/A",namespace="argo-rollouts",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="configmaps",name="argo-rollouts-config",namespace="argo-rollouts",status_code="200",verb="Get"} 1 +controller_clientset_k8s_request_total{kind="configmaps",name="argo-rollouts-notification-configmap",namespace="argo-rollouts",status_code="200",verb="Watch"} 4202 +controller_clientset_k8s_request_total{kind="events",name="N/A",namespace="default",status_code="200",verb="Patch"} 2 +controller_clientset_k8s_request_total{kind="events",name="N/A",namespace="default",status_code="201",verb="Create"} 23 +controller_clientset_k8s_request_total{kind="experiments",name="",namespace="",status_code="200",verb="Watch"} 4194 +controller_clientset_k8s_request_total{kind="experiments",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="ingresses",name="",namespace="",status_code="200",verb="Watch"} 4186 +controller_clientset_k8s_request_total{kind="ingresses",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="jobs",name="",namespace="",status_code="200",verb="Watch"} 4207 +controller_clientset_k8s_request_total{kind="jobs",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="leases",name="argo-rollouts-controller-lock",namespace="argo-rollouts",status_code="200",verb="Get"} 937822 +controller_clientset_k8s_request_total{kind="leases",name="argo-rollouts-controller-lock",namespace="argo-rollouts",status_code="200",verb="Update"} 937817 +controller_clientset_k8s_request_total{kind="replicasets",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="replicasets",name="N/A",namespace="",status_code="200",verb="Watch"} 4198 +controller_clientset_k8s_request_total{kind="replicasets",name="N/A",namespace="default",status_code="200",verb="Update"} 16 +controller_clientset_k8s_request_total{kind="replicasets",name="N/A",namespace="default",status_code="201",verb="Create"} 3 +controller_clientset_k8s_request_total{kind="replicasets",name="N/A",namespace="default",status_code="409",verb="Update"} 1 +controller_clientset_k8s_request_total{kind="rollouts",name="",namespace="",status_code="200",verb="Watch"} 4187 +controller_clientset_k8s_request_total{kind="rollouts",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="rollouts",name="rollouts-demo",namespace="default",status_code="200",verb="Update"} 4 +controller_clientset_k8s_request_total{kind="rollouts-demo",name="status",namespace="rollouts",status_code="200",verb="Patch"} 55 +controller_clientset_k8s_request_total{kind="rollouts-demo",name="status",namespace="rollouts",status_code="200",verb="Update"} 3 +controller_clientset_k8s_request_total{kind="secrets",name="N/A",namespace="argo-rollouts",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="secrets",name="argo-rollouts-notification-secret",namespace="argo-rollouts",status_code="200",verb="Watch"} 4195 +controller_clientset_k8s_request_total{kind="services",name="",namespace="",status_code="200",verb="Watch"} 4209 +controller_clientset_k8s_request_total{kind="services",name="N/A",namespace="",status_code="200",verb="List"} 1 +controller_clientset_k8s_request_total{kind="virtualservices",name="N/A",namespace="",status_code="404",verb="List"} 1 +controller_clientset_k8s_request_total{kind="virtualservices",name="N/A",namespace="argo-rollouts",status_code="404",verb="List"} 3145 +# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 7.4559e-05 +go_gc_duration_seconds{quantile="0.25"} 0.000204717 +go_gc_duration_seconds{quantile="0.5"} 0.000229263 +go_gc_duration_seconds{quantile="0.75"} 0.000265064 +go_gc_duration_seconds{quantile="1"} 0.002896558 +go_gc_duration_seconds_sum 4.163291925 +go_gc_duration_seconds_count 16072 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 220 +# HELP go_info Information about the Go environment. +# TYPE go_info gauge +go_info{version="go1.20.12"} 1 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 1.3780744e+07 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 1.18245779288e+11 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 6673 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 1.211516296e+09 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 9.169072e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 1.3780744e+07 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 5.988352e+06 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 1.7440768e+07 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 109750 +# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes gauge +go_memstats_heap_released_bytes 3.661824e+06 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 2.342912e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.7084509847987287e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 1.211626046e+09 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 2400 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 15600 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 284160 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 342720 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 1.8044152e+07 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 688543 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 1.736704e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 1.736704e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained from system. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 3.5388432e+07 +# HELP go_threads Number of OS threads created. +# TYPE go_threads gauge +go_threads 9 +# HELP notification_send Notification send performance. +# TYPE notification_send histogram +notification_send_bucket{name="rollouts-demo",namespace="default",le="0.01"} 93 +notification_send_bucket{name="rollouts-demo",namespace="default",le="0.15"} 94 +notification_send_bucket{name="rollouts-demo",namespace="default",le="0.25"} 94 +notification_send_bucket{name="rollouts-demo",namespace="default",le="0.5"} 94 +notification_send_bucket{name="rollouts-demo",namespace="default",le="1"} 94 +notification_send_bucket{name="rollouts-demo",namespace="default",le="+Inf"} 94 +notification_send_sum{name="rollouts-demo",namespace="default"} 0.029117867 +notification_send_count{name="rollouts-demo",namespace="default"} 94 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 3932.43 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 11 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 4.452352e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.70656495362e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 7.99895552e+08 +# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. +# TYPE process_virtual_memory_max_bytes gauge +process_virtual_memory_max_bytes 1.8446744073709552e+19 +# HELP rollout_events_total Count of rollout events +# TYPE rollout_events_total counter +rollout_events_total{name="rollouts-demo",namespace="default",reason="NewReplicaSetCreated",type="Normal"} 3 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutAborted",type="Warning"} 1 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutAddedToInformer",type="Normal"} 1 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutCompleted",type="Normal"} 2 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutNotCompleted",type="Normal"} 3 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutPaused",type="Normal"} 5 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutResumed",type="Normal"} 3 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutStepCompleted",type="Normal"} 9 +rollout_events_total{name="rollouts-demo",namespace="default",reason="RolloutUpdated",type="Normal"} 4 +rollout_events_total{name="rollouts-demo",namespace="default",reason="ScalingReplicaSet",type="Normal"} 15 +rollout_events_total{name="rollouts-demo",namespace="default",reason="SkipSteps",type="Normal"} 1 +# HELP rollout_info Information about rollout. +# TYPE rollout_info gauge +rollout_info{name="rollouts-demo",namespace="default",phase="Completed",strategy="canary",traffic_router=""} 1 +# HELP rollout_info_replicas_available The number of available replicas per rollout. +# TYPE rollout_info_replicas_available gauge +rollout_info_replicas_available{name="rollouts-demo",namespace="default"} 5 +# HELP rollout_info_replicas_desired The number of desired replicas per rollout. +# TYPE rollout_info_replicas_desired gauge +rollout_info_replicas_desired{name="rollouts-demo",namespace="default"} 5 +# HELP rollout_info_replicas_unavailable The number of unavailable replicas per rollout. +# TYPE rollout_info_replicas_unavailable gauge +rollout_info_replicas_unavailable{name="rollouts-demo",namespace="default"} 0 +# HELP rollout_info_replicas_updated The number of updated replicas per rollout. +# TYPE rollout_info_replicas_updated gauge +rollout_info_replicas_updated{name="rollouts-demo",namespace="default"} 5 +# HELP rollout_phase Information on the state of the rollout (DEPRECATED - use rollout_info) +# TYPE rollout_phase gauge +rollout_phase{name="rollouts-demo",namespace="default",phase="Abort",strategy="canary"} 0 +rollout_phase{name="rollouts-demo",namespace="default",phase="Completed",strategy="canary"} 1 +rollout_phase{name="rollouts-demo",namespace="default",phase="Error",strategy="canary"} 0 +rollout_phase{name="rollouts-demo",namespace="default",phase="Paused",strategy="canary"} 0 +rollout_phase{name="rollouts-demo",namespace="default",phase="Progressing",strategy="canary"} 0 +rollout_phase{name="rollouts-demo",namespace="default",phase="Timeout",strategy="canary"} 0 +# HELP rollout_reconcile Rollout reconciliation performance. +# TYPE rollout_reconcile histogram +rollout_reconcile_bucket{name="rollouts-demo",namespace="default",le="0.01"} 37 +rollout_reconcile_bucket{name="rollouts-demo",namespace="default",le="0.15"} 100 +rollout_reconcile_bucket{name="rollouts-demo",namespace="default",le="0.25"} 101 +rollout_reconcile_bucket{name="rollouts-demo",namespace="default",le="0.5"} 101 +rollout_reconcile_bucket{name="rollouts-demo",namespace="default",le="1"} 101 +rollout_reconcile_bucket{name="rollouts-demo",namespace="default",le="+Inf"} 101 +rollout_reconcile_sum{name="rollouts-demo",namespace="default"} 2.164373963000001 +rollout_reconcile_count{name="rollouts-demo",namespace="default"} 101 +# HELP rollout_reconcile_error Error occurring during the rollout +# TYPE rollout_reconcile_error counter +rollout_reconcile_error{name="rollouts-demo",namespace="default"} 1 +# HELP workqueue_adds_total [ALPHA] Total number of adds handled by workqueue +# TYPE workqueue_adds_total counter +workqueue_adds_total{name="AnalysisRuns"} 0 +workqueue_adds_total{name="DestinationRules"} 0 +workqueue_adds_total{name="Experiments"} 0 +workqueue_adds_total{name="Ingresses"} 0 +workqueue_adds_total{name="Rollouts"} 101 +workqueue_adds_total{name="Services"} 27249 +# HELP workqueue_depth [ALPHA] Current depth of workqueue +# TYPE workqueue_depth gauge +workqueue_depth{name="AnalysisRuns"} 0 +workqueue_depth{name="DestinationRules"} 0 +workqueue_depth{name="Experiments"} 0 +workqueue_depth{name="Ingresses"} 0 +workqueue_depth{name="Rollouts"} 0 +workqueue_depth{name="Services"} 0 +# HELP workqueue_longest_running_processor_seconds [ALPHA] How many seconds has the longest running processor for workqueue been running. +# TYPE workqueue_longest_running_processor_seconds gauge +workqueue_longest_running_processor_seconds{name="AnalysisRuns"} 0 +workqueue_longest_running_processor_seconds{name="DestinationRules"} 0 +workqueue_longest_running_processor_seconds{name="Experiments"} 0 +workqueue_longest_running_processor_seconds{name="Ingresses"} 0 +workqueue_longest_running_processor_seconds{name="Rollouts"} 0 +workqueue_longest_running_processor_seconds{name="Services"} 0 +# HELP workqueue_queue_duration_seconds [ALPHA] How long in seconds an item stays in workqueue before being requested. +# TYPE workqueue_queue_duration_seconds histogram +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="AnalysisRuns",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="AnalysisRuns"} 0 +workqueue_queue_duration_seconds_count{name="AnalysisRuns"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="DestinationRules",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="DestinationRules"} 0 +workqueue_queue_duration_seconds_count{name="DestinationRules"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="Experiments",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="Experiments"} 0 +workqueue_queue_duration_seconds_count{name="Experiments"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="9.999999999999999e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="9.999999999999999e-05"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="0.001"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="0.01"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="0.1"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="1"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="10"} 0 +workqueue_queue_duration_seconds_bucket{name="Ingresses",le="+Inf"} 0 +workqueue_queue_duration_seconds_sum{name="Ingresses"} 0 +workqueue_queue_duration_seconds_count{name="Ingresses"} 0 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="1e-06"} 0 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="9.999999999999999e-06"} 21 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="9.999999999999999e-05"} 53 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="0.001"} 66 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="0.01"} 77 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="0.1"} 101 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="1"} 101 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="10"} 101 +workqueue_queue_duration_seconds_bucket{name="Rollouts",le="+Inf"} 101 +workqueue_queue_duration_seconds_sum{name="Rollouts"} 0.6097181550000002 +workqueue_queue_duration_seconds_count{name="Rollouts"} 101 +workqueue_queue_duration_seconds_bucket{name="Services",le="1e-08"} 0 +workqueue_queue_duration_seconds_bucket{name="Services",le="1e-07"} 0 +workqueue_queue_duration_seconds_bucket{name="Services",le="1e-06"} 918 +workqueue_queue_duration_seconds_bucket{name="Services",le="9.999999999999999e-06"} 19169 +workqueue_queue_duration_seconds_bucket{name="Services",le="9.999999999999999e-05"} 27110 +workqueue_queue_duration_seconds_bucket{name="Services",le="0.001"} 27232 +workqueue_queue_duration_seconds_bucket{name="Services",le="0.01"} 27236 +workqueue_queue_duration_seconds_bucket{name="Services",le="0.1"} 27249 +workqueue_queue_duration_seconds_bucket{name="Services",le="1"} 27249 +workqueue_queue_duration_seconds_bucket{name="Services",le="10"} 27249 +workqueue_queue_duration_seconds_bucket{name="Services",le="+Inf"} 27249 +workqueue_queue_duration_seconds_sum{name="Services"} 1.4624588070000042 +workqueue_queue_duration_seconds_count{name="Services"} 27249 +# HELP workqueue_retries_total [ALPHA] Total number of retries handled by workqueue +# TYPE workqueue_retries_total counter +workqueue_retries_total{name="AnalysisRuns"} 0 +workqueue_retries_total{name="DestinationRules"} 0 +workqueue_retries_total{name="Experiments"} 0 +workqueue_retries_total{name="Ingresses"} 0 +workqueue_retries_total{name="Rollouts"} 172 +workqueue_retries_total{name="Services"} 0 +# HELP workqueue_unfinished_work_seconds [ALPHA] How many seconds of work has done that is in progress and hasn't been observed by work_duration. Large values indicate stuck threads. One can deduce the number of stuck threads by observing the rate at which this increases. +# TYPE workqueue_unfinished_work_seconds gauge +workqueue_unfinished_work_seconds{name="AnalysisRuns"} 0 +workqueue_unfinished_work_seconds{name="DestinationRules"} 0 +workqueue_unfinished_work_seconds{name="Experiments"} 0 +workqueue_unfinished_work_seconds{name="Ingresses"} 0 +workqueue_unfinished_work_seconds{name="Rollouts"} 0 +workqueue_unfinished_work_seconds{name="Services"} 0 +# HELP workqueue_work_duration_seconds [ALPHA] How long in seconds processing an item from workqueue takes. +# TYPE workqueue_work_duration_seconds histogram +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="AnalysisRuns",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="AnalysisRuns"} 0 +workqueue_work_duration_seconds_count{name="AnalysisRuns"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="DestinationRules",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="DestinationRules"} 0 +workqueue_work_duration_seconds_count{name="DestinationRules"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="Experiments",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="Experiments"} 0 +workqueue_work_duration_seconds_count{name="Experiments"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="0.01"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="0.1"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="1"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="10"} 0 +workqueue_work_duration_seconds_bucket{name="Ingresses",le="+Inf"} 0 +workqueue_work_duration_seconds_sum{name="Ingresses"} 0 +workqueue_work_duration_seconds_count{name="Ingresses"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="9.999999999999999e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="9.999999999999999e-05"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="0.001"} 0 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="0.01"} 37 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="0.1"} 99 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="1"} 101 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="10"} 101 +workqueue_work_duration_seconds_bucket{name="Rollouts",le="+Inf"} 101 +workqueue_work_duration_seconds_sum{name="Rollouts"} 2.193144629 +workqueue_work_duration_seconds_count{name="Rollouts"} 101 +workqueue_work_duration_seconds_bucket{name="Services",le="1e-08"} 0 +workqueue_work_duration_seconds_bucket{name="Services",le="1e-07"} 0 +workqueue_work_duration_seconds_bucket{name="Services",le="1e-06"} 0 +workqueue_work_duration_seconds_bucket{name="Services",le="9.999999999999999e-06"} 16021 +workqueue_work_duration_seconds_bucket{name="Services",le="9.999999999999999e-05"} 26981 +workqueue_work_duration_seconds_bucket{name="Services",le="0.001"} 27240 +workqueue_work_duration_seconds_bucket{name="Services",le="0.01"} 27249 +workqueue_work_duration_seconds_bucket{name="Services",le="0.1"} 27249 +workqueue_work_duration_seconds_bucket{name="Services",le="1"} 27249 +workqueue_work_duration_seconds_bucket{name="Services",le="10"} 27249 +workqueue_work_duration_seconds_bucket{name="Services",le="+Inf"} 27249 +workqueue_work_duration_seconds_sum{name="Services"} 0.4615282960000035 +workqueue_work_duration_seconds_count{name="Services"} 27249 \ No newline at end of file diff --git a/argo_rollouts/tests/kind/argo_rollouts_install.yaml b/argo_rollouts/tests/kind/argo_rollouts_install.yaml new file mode 100644 index 0000000000000..542bb0ab973fb --- /dev/null +++ b/argo_rollouts/tests/kind/argo_rollouts_install.yaml @@ -0,0 +1,15495 @@ +# This is an auto-generated file. DO NOT EDIT +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.1 + name: analysisruns.argoproj.io +spec: + group: argoproj.io + names: + kind: AnalysisRun + listKind: AnalysisRunList + plural: analysisruns + shortNames: + - ar + singular: analysisrun + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: AnalysisRun status + jsonPath: .status.phase + name: Status + type: string + - description: Time since resource was created + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + metrics: + items: + properties: + consecutiveErrorLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + failureCondition: + type: string + failureLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + inconclusiveLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + initialDelay: + type: string + interval: + type: string + name: + type: string + provider: + properties: + cloudWatch: + properties: + interval: + type: string + metricDataQueries: + items: + properties: + expression: + type: string + id: + type: string + label: + type: string + metricStat: + properties: + metric: + properties: + dimensions: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + metricName: + type: string + namespace: + type: string + type: object + period: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + stat: + type: string + unit: + type: string + type: object + period: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + returnData: + type: boolean + type: object + type: array + required: + - metricDataQueries + type: object + datadog: + properties: + apiVersion: + type: string + interval: + type: string + query: + type: string + required: + - query + type: object + graphite: + properties: + address: + type: string + query: + type: string + type: object + influxdb: + properties: + profile: + type: string + query: + type: string + type: object + job: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + backoffLimit: + format: int32 + type: integer + completionMode: + type: string + completions: + format: int32 + type: integer + manualSelector: + type: boolean + parallelism: + format: int32 + type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + suspend: + type: boolean + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + searches: + items: + type: string + type: array + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + ip: + type: string + type: object + type: array + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + imagePullSecrets: + items: + properties: + name: + type: string + type: object + x-kubernetes-map-type: atomic + type: array + initContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + securityContext: + properties: + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + x-kubernetes-preserve-unknown-fields: true + required: + - containers + type: object + type: object + ttlSecondsAfterFinished: + format: int32 + type: integer + required: + - template + type: object + required: + - spec + type: object + kayenta: + properties: + address: + type: string + application: + type: string + canaryConfigName: + type: string + configurationAccountName: + type: string + metricsAccountName: + type: string + scopes: + items: + properties: + controlScope: + properties: + end: + type: string + region: + type: string + scope: + type: string + start: + type: string + step: + format: int64 + type: integer + required: + - end + - region + - scope + - start + - step + type: object + experimentScope: + properties: + end: + type: string + region: + type: string + scope: + type: string + start: + type: string + step: + format: int64 + type: integer + required: + - end + - region + - scope + - start + - step + type: object + name: + type: string + required: + - controlScope + - experimentScope + - name + type: object + type: array + storageAccountName: + type: string + threshold: + properties: + marginal: + format: int64 + type: integer + pass: + format: int64 + type: integer + required: + - marginal + - pass + type: object + required: + - address + - application + - canaryConfigName + - configurationAccountName + - metricsAccountName + - scopes + - storageAccountName + - threshold + type: object + newRelic: + properties: + profile: + type: string + query: + type: string + required: + - query + type: object + plugin: + type: object + x-kubernetes-preserve-unknown-fields: true + prometheus: + properties: + address: + type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + insecure: + type: boolean + query: + type: string + timeout: + format: int64 + type: integer + type: object + skywalking: + properties: + address: + type: string + interval: + type: string + query: + type: string + type: object + wavefront: + properties: + address: + type: string + query: + type: string + type: object + web: + properties: + body: + type: string + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + insecure: + type: boolean + jsonBody: + type: object + x-kubernetes-preserve-unknown-fields: true + jsonPath: + type: string + method: + type: string + timeoutSeconds: + format: int64 + type: integer + url: + type: string + required: + - url + type: object + type: object + successCondition: + type: string + required: + - name + - provider + type: object + type: array + terminate: + type: boolean + required: + - metrics + type: object + status: + properties: + dryRunSummary: + properties: + count: + format: int32 + type: integer + error: + format: int32 + type: integer + failed: + format: int32 + type: integer + inconclusive: + format: int32 + type: integer + successful: + format: int32 + type: integer + type: object + message: + type: string + metricResults: + items: + properties: + consecutiveError: + format: int32 + type: integer + count: + format: int32 + type: integer + dryRun: + type: boolean + error: + format: int32 + type: integer + failed: + format: int32 + type: integer + inconclusive: + format: int32 + type: integer + measurements: + items: + properties: + finishedAt: + format: date-time + type: string + message: + type: string + metadata: + additionalProperties: + type: string + type: object + phase: + type: string + resumeAt: + format: date-time + type: string + startedAt: + format: date-time + type: string + value: + type: string + required: + - phase + type: object + type: array + message: + type: string + metadata: + additionalProperties: + type: string + type: object + name: + type: string + phase: + type: string + successful: + format: int32 + type: integer + required: + - name + - phase + type: object + type: array + phase: + type: string + runSummary: + properties: + count: + format: int32 + type: integer + error: + format: int32 + type: integer + failed: + format: int32 + type: integer + inconclusive: + format: int32 + type: integer + successful: + format: int32 + type: integer + type: object + startedAt: + format: date-time + type: string + required: + - phase + type: object + required: + - spec + type: object + served: true + storage: true + subresources: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.1 + name: analysistemplates.argoproj.io +spec: + group: argoproj.io + names: + kind: AnalysisTemplate + listKind: AnalysisTemplateList + plural: analysistemplates + shortNames: + - at + singular: analysistemplate + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Time since resource was created + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + metrics: + items: + properties: + consecutiveErrorLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + failureCondition: + type: string + failureLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + inconclusiveLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + initialDelay: + type: string + interval: + type: string + name: + type: string + provider: + properties: + cloudWatch: + properties: + interval: + type: string + metricDataQueries: + items: + properties: + expression: + type: string + id: + type: string + label: + type: string + metricStat: + properties: + metric: + properties: + dimensions: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + metricName: + type: string + namespace: + type: string + type: object + period: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + stat: + type: string + unit: + type: string + type: object + period: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + returnData: + type: boolean + type: object + type: array + required: + - metricDataQueries + type: object + datadog: + properties: + apiVersion: + type: string + interval: + type: string + query: + type: string + required: + - query + type: object + graphite: + properties: + address: + type: string + query: + type: string + type: object + influxdb: + properties: + profile: + type: string + query: + type: string + type: object + job: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + backoffLimit: + format: int32 + type: integer + completionMode: + type: string + completions: + format: int32 + type: integer + manualSelector: + type: boolean + parallelism: + format: int32 + type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + suspend: + type: boolean + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + searches: + items: + type: string + type: array + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + ip: + type: string + type: object + type: array + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + imagePullSecrets: + items: + properties: + name: + type: string + type: object + x-kubernetes-map-type: atomic + type: array + initContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + securityContext: + properties: + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + x-kubernetes-preserve-unknown-fields: true + required: + - containers + type: object + type: object + ttlSecondsAfterFinished: + format: int32 + type: integer + required: + - template + type: object + required: + - spec + type: object + kayenta: + properties: + address: + type: string + application: + type: string + canaryConfigName: + type: string + configurationAccountName: + type: string + metricsAccountName: + type: string + scopes: + items: + properties: + controlScope: + properties: + end: + type: string + region: + type: string + scope: + type: string + start: + type: string + step: + format: int64 + type: integer + required: + - end + - region + - scope + - start + - step + type: object + experimentScope: + properties: + end: + type: string + region: + type: string + scope: + type: string + start: + type: string + step: + format: int64 + type: integer + required: + - end + - region + - scope + - start + - step + type: object + name: + type: string + required: + - controlScope + - experimentScope + - name + type: object + type: array + storageAccountName: + type: string + threshold: + properties: + marginal: + format: int64 + type: integer + pass: + format: int64 + type: integer + required: + - marginal + - pass + type: object + required: + - address + - application + - canaryConfigName + - configurationAccountName + - metricsAccountName + - scopes + - storageAccountName + - threshold + type: object + newRelic: + properties: + profile: + type: string + query: + type: string + required: + - query + type: object + plugin: + type: object + x-kubernetes-preserve-unknown-fields: true + prometheus: + properties: + address: + type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + insecure: + type: boolean + query: + type: string + timeout: + format: int64 + type: integer + type: object + skywalking: + properties: + address: + type: string + interval: + type: string + query: + type: string + type: object + wavefront: + properties: + address: + type: string + query: + type: string + type: object + web: + properties: + body: + type: string + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + insecure: + type: boolean + jsonBody: + type: object + x-kubernetes-preserve-unknown-fields: true + jsonPath: + type: string + method: + type: string + timeoutSeconds: + format: int64 + type: integer + url: + type: string + required: + - url + type: object + type: object + successCondition: + type: string + required: + - name + - provider + type: object + type: array + required: + - metrics + type: object + required: + - spec + type: object + served: true + storage: true + subresources: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.1 + name: clusteranalysistemplates.argoproj.io +spec: + group: argoproj.io + names: + kind: ClusterAnalysisTemplate + listKind: ClusterAnalysisTemplateList + plural: clusteranalysistemplates + shortNames: + - cat + singular: clusteranalysistemplate + preserveUnknownFields: false + scope: Cluster + versions: + - additionalPrinterColumns: + - description: Time since resource was created + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + metrics: + items: + properties: + consecutiveErrorLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + failureCondition: + type: string + failureLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + inconclusiveLimit: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + initialDelay: + type: string + interval: + type: string + name: + type: string + provider: + properties: + cloudWatch: + properties: + interval: + type: string + metricDataQueries: + items: + properties: + expression: + type: string + id: + type: string + label: + type: string + metricStat: + properties: + metric: + properties: + dimensions: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + metricName: + type: string + namespace: + type: string + type: object + period: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + stat: + type: string + unit: + type: string + type: object + period: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + returnData: + type: boolean + type: object + type: array + required: + - metricDataQueries + type: object + datadog: + properties: + apiVersion: + type: string + interval: + type: string + query: + type: string + required: + - query + type: object + graphite: + properties: + address: + type: string + query: + type: string + type: object + influxdb: + properties: + profile: + type: string + query: + type: string + type: object + job: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + backoffLimit: + format: int32 + type: integer + completionMode: + type: string + completions: + format: int32 + type: integer + manualSelector: + type: boolean + parallelism: + format: int32 + type: integer + podFailurePolicy: + properties: + rules: + items: + properties: + action: + type: string + onExitCodes: + properties: + containerName: + type: string + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + - values + type: object + onPodConditions: + items: + properties: + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + required: + - action + - onPodConditions + type: object + type: array + x-kubernetes-list-type: atomic + required: + - rules + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + suspend: + type: boolean + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + searches: + items: + type: string + type: array + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + ip: + type: string + type: object + type: array + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + imagePullSecrets: + items: + properties: + name: + type: string + type: object + x-kubernetes-map-type: atomic + type: array + initContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + securityContext: + properties: + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + x-kubernetes-preserve-unknown-fields: true + required: + - containers + type: object + type: object + ttlSecondsAfterFinished: + format: int32 + type: integer + required: + - template + type: object + required: + - spec + type: object + kayenta: + properties: + address: + type: string + application: + type: string + canaryConfigName: + type: string + configurationAccountName: + type: string + metricsAccountName: + type: string + scopes: + items: + properties: + controlScope: + properties: + end: + type: string + region: + type: string + scope: + type: string + start: + type: string + step: + format: int64 + type: integer + required: + - end + - region + - scope + - start + - step + type: object + experimentScope: + properties: + end: + type: string + region: + type: string + scope: + type: string + start: + type: string + step: + format: int64 + type: integer + required: + - end + - region + - scope + - start + - step + type: object + name: + type: string + required: + - controlScope + - experimentScope + - name + type: object + type: array + storageAccountName: + type: string + threshold: + properties: + marginal: + format: int64 + type: integer + pass: + format: int64 + type: integer + required: + - marginal + - pass + type: object + required: + - address + - application + - canaryConfigName + - configurationAccountName + - metricsAccountName + - scopes + - storageAccountName + - threshold + type: object + newRelic: + properties: + profile: + type: string + query: + type: string + required: + - query + type: object + plugin: + type: object + x-kubernetes-preserve-unknown-fields: true + prometheus: + properties: + address: + type: string + authentication: + properties: + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + insecure: + type: boolean + query: + type: string + timeout: + format: int64 + type: integer + type: object + skywalking: + properties: + address: + type: string + interval: + type: string + query: + type: string + type: object + wavefront: + properties: + address: + type: string + query: + type: string + type: object + web: + properties: + body: + type: string + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + insecure: + type: boolean + jsonBody: + type: object + x-kubernetes-preserve-unknown-fields: true + jsonPath: + type: string + method: + type: string + timeoutSeconds: + format: int64 + type: integer + url: + type: string + required: + - url + type: object + type: object + successCondition: + type: string + required: + - name + - provider + type: object + type: array + required: + - metrics + type: object + required: + - spec + type: object + served: true + storage: true + subresources: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.1 + name: experiments.argoproj.io +spec: + group: argoproj.io + names: + kind: Experiment + listKind: ExperimentList + plural: experiments + shortNames: + - exp + singular: experiment + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Experiment status + jsonPath: .status.phase + name: Status + type: string + - description: Time since resource was created + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + analyses: + items: + properties: + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + type: object + required: + - name + type: object + type: array + clusterScope: + type: boolean + name: + type: string + requiredForCompletion: + type: boolean + templateName: + type: string + required: + - name + - templateName + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + duration: + type: string + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + progressDeadlineSeconds: + format: int32 + type: integer + scaleDownDelaySeconds: + format: int32 + type: integer + templates: + items: + properties: + minReadySeconds: + format: int32 + type: integer + name: + type: string + replicas: + format: int32 + type: integer + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + service: + properties: + name: + type: string + type: object + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + searches: + items: + type: string + type: array + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + ip: + type: string + type: object + type: array + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + imagePullSecrets: + items: + properties: + name: + type: string + type: object + x-kubernetes-map-type: atomic + type: array + initContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + securityContext: + properties: + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + x-kubernetes-preserve-unknown-fields: true + required: + - containers + type: object + type: object + required: + - name + - selector + - template + type: object + type: array + terminate: + type: boolean + required: + - templates + type: object + status: + properties: + analysisRuns: + items: + properties: + analysisRun: + type: string + message: + type: string + name: + type: string + phase: + type: string + required: + - analysisRun + - name + - phase + type: object + type: array + availableAt: + format: date-time + type: string + conditions: + items: + properties: + lastTransitionTime: + format: date-time + type: string + lastUpdateTime: + format: date-time + type: string + message: + type: string + reason: + type: string + status: + type: string + type: + type: string + required: + - lastTransitionTime + - lastUpdateTime + - message + - reason + - status + - type + type: object + type: array + message: + type: string + phase: + type: string + templateStatuses: + items: + properties: + availableReplicas: + format: int32 + type: integer + collisionCount: + format: int32 + type: integer + lastTransitionTime: + format: date-time + type: string + message: + type: string + name: + type: string + podTemplateHash: + type: string + readyReplicas: + format: int32 + type: integer + replicas: + format: int32 + type: integer + serviceName: + type: string + status: + type: string + updatedReplicas: + format: int32 + type: integer + required: + - availableReplicas + - name + - readyReplicas + - replicas + - updatedReplicas + type: object + type: array + type: object + required: + - spec + type: object + served: true + storage: true + subresources: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.1 + name: rollouts.argoproj.io +spec: + group: argoproj.io + names: + kind: Rollout + listKind: RolloutList + plural: rollouts + shortNames: + - ro + singular: rollout + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Number of desired pods + jsonPath: .spec.replicas + name: Desired + type: integer + - description: Total number of non-terminated pods targeted by this rollout + jsonPath: .status.replicas + name: Current + type: integer + - description: Total number of non-terminated pods targeted by this rollout that + have the desired template spec + jsonPath: .status.updatedReplicas + name: Up-to-date + type: integer + - description: Total number of available pods (ready for at least minReadySeconds) + targeted by this rollout + jsonPath: .status.availableReplicas + name: Available + type: integer + - description: Time since resource was created + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + analysis: + properties: + successfulRunHistoryLimit: + format: int32 + type: integer + unsuccessfulRunHistoryLimit: + format: int32 + type: integer + type: object + minReadySeconds: + format: int32 + type: integer + paused: + type: boolean + progressDeadlineAbort: + type: boolean + progressDeadlineSeconds: + format: int32 + type: integer + replicas: + format: int32 + type: integer + restartAt: + format: date-time + type: string + revisionHistoryLimit: + format: int32 + type: integer + rollbackWindow: + properties: + revisions: + format: int32 + type: integer + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + strategy: + properties: + blueGreen: + properties: + abortScaleDownDelaySeconds: + format: int32 + type: integer + activeMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + activeService: + type: string + antiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + properties: + weight: + format: int32 + type: integer + required: + - weight + type: object + requiredDuringSchedulingIgnoredDuringExecution: + type: object + type: object + autoPromotionEnabled: + type: boolean + autoPromotionSeconds: + format: int32 + type: integer + maxUnavailable: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + postPromotionAnalysis: + properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + podTemplateHashValue: + type: string + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array + type: object + prePromotionAnalysis: + properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + podTemplateHashValue: + type: string + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array + type: object + previewMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + previewReplicaCount: + format: int32 + type: integer + previewService: + type: string + scaleDownDelayRevisionLimit: + format: int32 + type: integer + scaleDownDelaySeconds: + format: int32 + type: integer + required: + - activeService + type: object + canary: + properties: + abortScaleDownDelaySeconds: + format: int32 + type: integer + analysis: + properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + podTemplateHashValue: + type: string + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + startingStep: + format: int32 + type: integer + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array + type: object + antiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + properties: + weight: + format: int32 + type: integer + required: + - weight + type: object + requiredDuringSchedulingIgnoredDuringExecution: + type: object + type: object + canaryMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + canaryService: + type: string + dynamicStableScale: + type: boolean + maxSurge: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + maxUnavailable: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + minPodsPerReplicaSet: + format: int32 + type: integer + pingPong: + properties: + pingService: + type: string + pongService: + type: string + required: + - pingService + - pongService + type: object + scaleDownDelayRevisionLimit: + format: int32 + type: integer + scaleDownDelaySeconds: + format: int32 + type: integer + stableMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + stableService: + type: string + steps: + items: + properties: + analysis: + properties: + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + podTemplateHashValue: + type: string + type: object + required: + - name + type: object + type: array + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array + measurementRetention: + items: + properties: + limit: + format: int32 + type: integer + metricName: + type: string + required: + - limit + - metricName + type: object + type: array + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array + type: object + experiment: + properties: + analyses: + items: + properties: + args: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + fieldRef: + properties: + fieldPath: + type: string + required: + - fieldPath + type: object + podTemplateHashValue: + type: string + type: object + required: + - name + type: object + type: array + clusterScope: + type: boolean + name: + type: string + requiredForCompletion: + type: boolean + templateName: + type: string + required: + - name + - templateName + type: object + type: array + duration: + type: string + templates: + items: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + name: + type: string + replicas: + format: int32 + type: integer + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + service: + properties: + name: + type: string + type: object + specRef: + type: string + weight: + format: int32 + type: integer + required: + - name + - specRef + type: object + type: array + required: + - templates + type: object + pause: + properties: + duration: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: object + setCanaryScale: + properties: + matchTrafficWeight: + type: boolean + replicas: + format: int32 + type: integer + weight: + format: int32 + type: integer + type: object + setHeaderRoute: + properties: + match: + items: + properties: + headerName: + type: string + headerValue: + properties: + exact: + type: string + prefix: + type: string + regex: + type: string + type: object + required: + - headerName + - headerValue + type: object + type: array + name: + type: string + type: object + setMirrorRoute: + properties: + match: + items: + properties: + headers: + additionalProperties: + properties: + exact: + type: string + prefix: + type: string + regex: + type: string + type: object + type: object + method: + properties: + exact: + type: string + prefix: + type: string + regex: + type: string + type: object + path: + properties: + exact: + type: string + prefix: + type: string + regex: + type: string + type: object + type: object + type: array + name: + type: string + percentage: + format: int32 + type: integer + required: + - name + type: object + setWeight: + format: int32 + type: integer + type: object + type: array + trafficRouting: + properties: + alb: + properties: + annotationPrefix: + type: string + ingress: + type: string + ingresses: + items: + type: string + type: array + rootService: + type: string + servicePort: + format: int32 + type: integer + stickinessConfig: + properties: + durationSeconds: + format: int64 + type: integer + enabled: + type: boolean + required: + - durationSeconds + - enabled + type: object + required: + - servicePort + type: object + ambassador: + properties: + mappings: + items: + type: string + type: array + required: + - mappings + type: object + apisix: + properties: + route: + properties: + name: + type: string + rules: + items: + type: string + type: array + required: + - name + type: object + type: object + appMesh: + properties: + virtualNodeGroup: + properties: + canaryVirtualNodeRef: + properties: + name: + type: string + required: + - name + type: object + stableVirtualNodeRef: + properties: + name: + type: string + required: + - name + type: object + required: + - canaryVirtualNodeRef + - stableVirtualNodeRef + type: object + virtualService: + properties: + name: + type: string + routes: + items: + type: string + type: array + required: + - name + type: object + type: object + istio: + properties: + destinationRule: + properties: + canarySubsetName: + type: string + name: + type: string + stableSubsetName: + type: string + required: + - canarySubsetName + - name + - stableSubsetName + type: object + virtualService: + properties: + name: + type: string + routes: + items: + type: string + type: array + tcpRoutes: + items: + properties: + port: + format: int64 + type: integer + type: object + type: array + tlsRoutes: + items: + properties: + port: + format: int64 + type: integer + sniHosts: + items: + type: string + type: array + type: object + type: array + required: + - name + type: object + virtualServices: + items: + properties: + name: + type: string + routes: + items: + type: string + type: array + tcpRoutes: + items: + properties: + port: + format: int64 + type: integer + type: object + type: array + tlsRoutes: + items: + properties: + port: + format: int64 + type: integer + sniHosts: + items: + type: string + type: array + type: object + type: array + required: + - name + type: object + type: array + type: object + managedRoutes: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + nginx: + properties: + additionalIngressAnnotations: + additionalProperties: + type: string + type: object + annotationPrefix: + type: string + stableIngress: + type: string + stableIngresses: + items: + type: string + type: array + type: object + plugins: + type: object + x-kubernetes-preserve-unknown-fields: true + smi: + properties: + rootService: + type: string + trafficSplitName: + type: string + type: object + traefik: + properties: + weightedTraefikServiceName: + type: string + required: + - weightedTraefikServiceName + type: object + type: object + type: object + type: object + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + searches: + items: + type: string + type: array + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + ip: + type: string + type: object + type: array + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + imagePullSecrets: + items: + properties: + name: + type: string + type: object + x-kubernetes-map-type: atomic + type: array + initContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + x-kubernetes-preserve-unknown-fields: true + requests: + x-kubernetes-preserve-unknown-fields: true + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + securityContext: + properties: + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + items: + x-kubernetes-preserve-unknown-fields: true + type: array + required: + - containers + type: object + type: object + workloadRef: + properties: + apiVersion: + type: string + kind: + type: string + name: + type: string + type: object + type: object + status: + properties: + HPAReplicas: + format: int32 + type: integer + abort: + type: boolean + abortedAt: + format: date-time + type: string + alb: + properties: + canaryTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + ingress: + type: string + loadBalancer: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + stableTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + type: object + albs: + items: + properties: + canaryTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + ingress: + type: string + loadBalancer: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + stableTargetGroup: + properties: + arn: + type: string + fullName: + type: string + name: + type: string + required: + - arn + - name + type: object + type: object + type: array + availableReplicas: + format: int32 + type: integer + blueGreen: + properties: + activeSelector: + type: string + postPromotionAnalysisRunStatus: + properties: + message: + type: string + name: + type: string + status: + type: string + required: + - name + - status + type: object + prePromotionAnalysisRunStatus: + properties: + message: + type: string + name: + type: string + status: + type: string + required: + - name + - status + type: object + previewSelector: + type: string + scaleUpPreviewCheckPoint: + type: boolean + type: object + canary: + properties: + currentBackgroundAnalysisRunStatus: + properties: + message: + type: string + name: + type: string + status: + type: string + required: + - name + - status + type: object + currentExperiment: + type: string + currentStepAnalysisRunStatus: + properties: + message: + type: string + name: + type: string + status: + type: string + required: + - name + - status + type: object + stablePingPong: + type: string + weights: + properties: + additional: + items: + properties: + podTemplateHash: + type: string + serviceName: + type: string + weight: + format: int32 + type: integer + required: + - weight + type: object + type: array + canary: + properties: + podTemplateHash: + type: string + serviceName: + type: string + weight: + format: int32 + type: integer + required: + - weight + type: object + stable: + properties: + podTemplateHash: + type: string + serviceName: + type: string + weight: + format: int32 + type: integer + required: + - weight + type: object + verified: + type: boolean + required: + - canary + - stable + type: object + type: object + collisionCount: + format: int32 + type: integer + conditions: + items: + properties: + lastTransitionTime: + format: date-time + type: string + lastUpdateTime: + format: date-time + type: string + message: + type: string + reason: + type: string + status: + type: string + type: + type: string + required: + - lastTransitionTime + - lastUpdateTime + - message + - reason + - status + - type + type: object + type: array + controllerPause: + type: boolean + currentPodHash: + type: string + currentStepHash: + type: string + currentStepIndex: + format: int32 + type: integer + message: + type: string + observedGeneration: + type: string + pauseConditions: + items: + properties: + reason: + type: string + startTime: + format: date-time + type: string + required: + - reason + - startTime + type: object + type: array + phase: + type: string + promoteFull: + type: boolean + readyReplicas: + format: int32 + type: integer + replicas: + format: int32 + type: integer + restartedAt: + format: date-time + type: string + selector: + type: string + stableRS: + type: string + updatedReplicas: + format: int32 + type: integer + workloadObservedGeneration: + type: string + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + scale: + labelSelectorPath: .status.selector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.HPAReplicas + status: {} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: rollouts-controller + app.kubernetes.io/name: argo-rollouts + app.kubernetes.io/part-of: argo-rollouts + name: argo-rollouts +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: rollouts-controller + app.kubernetes.io/name: argo-rollouts + app.kubernetes.io/part-of: argo-rollouts + name: argo-rollouts +rules: +- apiGroups: + - argoproj.io + resources: + - rollouts + - rollouts/status + - rollouts/finalizers + verbs: + - get + - list + - watch + - update + - patch +- apiGroups: + - argoproj.io + resources: + - analysisruns + - analysisruns/finalizers + - experiments + - experiments/finalizers + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - argoproj.io + resources: + - analysistemplates + - clusteranalysistemplates + verbs: + - get + - list + - watch +- apiGroups: + - apps + resources: + - replicasets + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - "" + - apps + resources: + - deployments + - podtemplates + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - patch + - create + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - get + - update +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - pods + verbs: + - list + - update + - watch +- apiGroups: + - "" + resources: + - pods/eviction + verbs: + - create +- apiGroups: + - "" + resources: + - events + verbs: + - create + - update + - patch +- apiGroups: + - networking.k8s.io + - extensions + resources: + - ingresses + verbs: + - create + - get + - list + - watch + - update + - patch +- apiGroups: + - batch + resources: + - jobs + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - networking.istio.io + resources: + - virtualservices + - destinationrules + verbs: + - watch + - get + - update + - patch + - list +- apiGroups: + - split.smi-spec.io + resources: + - trafficsplits + verbs: + - create + - watch + - get + - update + - patch +- apiGroups: + - getambassador.io + - x.getambassador.io + resources: + - mappings + - ambassadormappings + verbs: + - create + - watch + - get + - update + - list + - delete +- apiGroups: + - "" + resources: + - endpoints + verbs: + - get +- apiGroups: + - elbv2.k8s.aws + resources: + - targetgroupbindings + verbs: + - list + - get +- apiGroups: + - appmesh.k8s.aws + resources: + - virtualservices + verbs: + - watch + - get + - list +- apiGroups: + - appmesh.k8s.aws + resources: + - virtualnodes + - virtualrouters + verbs: + - watch + - get + - list + - update + - patch +- apiGroups: + - traefik.containo.us + resources: + - traefikservices + verbs: + - watch + - get + - update +- apiGroups: + - apisix.apache.org + resources: + - apisixroutes + verbs: + - watch + - get + - update +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: aggregate-cluster-role + app.kubernetes.io/name: argo-rollouts-aggregate-to-admin + app.kubernetes.io/part-of: argo-rollouts + rbac.authorization.k8s.io/aggregate-to-admin: "true" + name: argo-rollouts-aggregate-to-admin +rules: +- apiGroups: + - argoproj.io + resources: + - rollouts + - rollouts/scale + - rollouts/status + - experiments + - analysistemplates + - clusteranalysistemplates + - analysisruns + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: aggregate-cluster-role + app.kubernetes.io/name: argo-rollouts-aggregate-to-edit + app.kubernetes.io/part-of: argo-rollouts + rbac.authorization.k8s.io/aggregate-to-edit: "true" + name: argo-rollouts-aggregate-to-edit +rules: +- apiGroups: + - argoproj.io + resources: + - rollouts + - rollouts/scale + - rollouts/status + - experiments + - analysistemplates + - clusteranalysistemplates + - analysisruns + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: aggregate-cluster-role + app.kubernetes.io/name: argo-rollouts-aggregate-to-view + app.kubernetes.io/part-of: argo-rollouts + rbac.authorization.k8s.io/aggregate-to-view: "true" + name: argo-rollouts-aggregate-to-view +rules: +- apiGroups: + - argoproj.io + resources: + - rollouts + - rollouts/scale + - experiments + - analysistemplates + - clusteranalysistemplates + - analysisruns + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: rollouts-controller + app.kubernetes.io/name: argo-rollouts + app.kubernetes.io/part-of: argo-rollouts + name: argo-rollouts +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: argo-rollouts +subjects: +- kind: ServiceAccount + name: argo-rollouts + namespace: argo-rollouts +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/component: rollouts-controller + app.kubernetes.io/name: argo-rollouts + app.kubernetes.io/part-of: argo-rollouts + name: argo-rollouts-config +--- +apiVersion: v1 +kind: Secret +metadata: + name: argo-rollouts-notification-secret +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argo-rollouts-metrics + app.kubernetes.io/part-of: argo-rollouts + name: argo-rollouts-metrics +spec: + ports: + - name: metrics + port: 8090 + protocol: TCP + targetPort: 8090 + selector: + app.kubernetes.io/name: argo-rollouts +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: rollouts-controller + app.kubernetes.io/name: argo-rollouts + app.kubernetes.io/part-of: argo-rollouts + name: argo-rollouts +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: argo-rollouts + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: argo-rollouts + spec: + containers: + - image: quay.io/argoproj/argo-rollouts:v1.6.6 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 30 + periodSeconds: 20 + successThreshold: 1 + timeoutSeconds: 10 + name: argo-rollouts + ports: + - containerPort: 8090 + name: metrics + - containerPort: 8080 + name: healthz + readinessProbe: + failureThreshold: 3 + httpGet: + path: /metrics + port: metrics + initialDelaySeconds: 10 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 4 + securityContext: + runAsNonRoot: true + serviceAccountName: argo-rollouts diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py new file mode 100644 index 0000000000000..84952f049d121 --- /dev/null +++ b/argo_rollouts/tests/test_e2e.py @@ -0,0 +1,9 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under Simplified BSD License (see LICENSE) +import pytest + + +@pytest.mark.e2e +def test_e2e_openmetrics_v1(dd_agent_check): + return {} From 36e948887b97f93fcdad336ebff1ad12e40ca0dd Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 28 Feb 2024 15:58:35 -0500 Subject: [PATCH 03/43] add simple tests --- argo_rollouts/tests/common.py | 137 +++++++++++++++++++++++++++++++ argo_rollouts/tests/test_e2e.py | 16 +++- argo_rollouts/tests/test_unit.py | 28 ++++--- 3 files changed, 168 insertions(+), 13 deletions(-) create mode 100644 argo_rollouts/tests/common.py diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py new file mode 100644 index 0000000000000..9cd5d79ce399f --- /dev/null +++ b/argo_rollouts/tests/common.py @@ -0,0 +1,137 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +import os + +from datadog_checks.base import is_affirmative +from datadog_checks.dev import get_here + +HERE = get_here() + +OM_MOCKED_INSTANCE = { + 'openmetrics_endpoint': 'http://weaviate:2112/metrics', + 'tags': ['test:tag'], +} + +OM_METRICS = [ + 'argo_rollouts.conroller.info', + 'argo_rollouts.controller.clientset.k8s.request.count', + 'argo_rollouts.go.gc.duration.seconds.count', + 'argo_rollouts.go.gc.duration.seconds.quantile', + 'argo_rollouts.go.gc.duration.seconds.sum', + 'argo_rollouts.go.goroutines', + 'argo_rollouts.go.info', + 'argo_rollouts.go.memstats.alloc_bytes', + 'argo_rollouts.go.memstats.alloc_bytes.count', + 'argo_rollouts.go.memstats.buck.hash.sys.bytes', + 'argo_rollouts.go.memstats.frees.count', + 'argo_rollouts.go.memstats.gc.sys.bytes', + 'argo_rollouts.go.memstats.heap.alloc.bytes', + 'argo_rollouts.go.memstats.heap.idle.bytes', + 'argo_rollouts.go.memstats.heap.inuse.byes', + 'argo_rollouts.go.memstats.heap.objects', + 'argo_rollouts.go.memstats.heap.released.bytes', + 'argo_rollouts.go.memstats.heap.sys.bytes', + 'argo_rollouts.go.memstats.last.gc.time.seconds', + 'argo_rollouts.go.memstats.lookups.count', + 'argo_rollouts.go.memstats.mallocs.count', + 'argo_rollouts.go.memstats.mcache.inuse.bytes', + 'argo_rollouts.go.memstats.mcache.sys.bytes', + 'argo_rollouts.go.memstats.mspan.inuse.bytes', + 'argo_rollouts.go.memstats.mspan.sys.bytes', + 'argo_rollouts.go.memstats.next.gc.bytes', + 'argo_rollouts.go.memstats.other.sys.bytes', + 'argo_rollouts.go.memstats.stack.inuse.bytes', + 'argo_rollouts.go.memstats.stack.sys.bytes', + 'argo_rollouts.go.memstats.sys.bytes', + 'argo_rollouts.go.threads', + 'argo_rollouts.notification.send.bucket', + 'argo_rollouts.notification.send.count', + 'argo_rollouts.notification.send.sum', + 'argo_rollouts.process.cpu.seconds.count', + 'argo_rollouts.process.max.fds', + 'argo_rollouts.process.open.fds', + 'argo_rollouts.process.resident.memory.bytes', + 'argo_rollouts.process.start.time.seconds', + 'argo_rollouts.process.virtual.memory.bytes', + 'argo_rollouts.process.virtual.memory.max.bytes', + 'argo_rollouts.rollout.events.count', + 'argo_rollouts.rollout.info', + 'argo_rollouts.rollout.info.replicas.available', + 'argo_rollouts.rollout.info.replicas.desired', + 'argo_rollouts.rollout.info.replicas.unavailable', + 'argo_rollouts.rollout.info.replicas.updated', + 'argo_rollouts.rollout.phase', + 'argo_rollouts.rollout.reconcile.bucket', + 'argo_rollouts.rollout.reconcile.count', + 'argo_rollouts.rollout.reconcile.error.count', + 'argo_rollouts.rollout.reconcile.sum', + 'argo_rollouts.workqueue.adds.count', + 'argo_rollouts.workqueue.depth', + 'argo_rollouts.workqueue.longest.running.processor.seconds', + 'argo_rollouts.workqueue.queue.duration.seconds.bucket', + 'argo_rollouts.workqueue.queue.duration.seconds.count', + 'argo_rollouts.workqueue.queue.duration.seconds.sum', + 'argo_rollouts.workqueue.retries.count', + 'argo_rollouts.workqueue.unfinished.work.seconds', + 'argo_rollouts.workqueue.work.duration.seconds.bucket', + 'argo_rollouts.workqueue.work.duration.seconds.count', + 'argo_rollouts.workqueue.work.duration.seconds.sum', +] + +E2E_METRICS = [ + 'argo_rollouts.conroller.info', + 'argo_rollouts.controller.clientset.k8s.request.count', + 'argo_rollouts.go.gc.duration.seconds.count', + 'argo_rollouts.go.gc.duration.seconds.quantile', + 'argo_rollouts.go.gc.duration.seconds.sum', + 'argo_rollouts.go.goroutines', + 'argo_rollouts.go.info', + 'argo_rollouts.go.memstats.alloc_bytes', + 'argo_rollouts.go.memstats.alloc_bytes.count', + 'argo_rollouts.go.memstats.buck.hash.sys.bytes', + 'argo_rollouts.go.memstats.frees.count', + 'argo_rollouts.go.memstats.gc.sys.bytes', + 'argo_rollouts.go.memstats.heap.alloc.bytes', + 'argo_rollouts.go.memstats.heap.idle.bytes', + 'argo_rollouts.go.memstats.heap.inuse.byes', + 'argo_rollouts.go.memstats.heap.objects', + 'argo_rollouts.go.memstats.heap.released.bytes', + 'argo_rollouts.go.memstats.heap.sys.bytes', + 'argo_rollouts.go.memstats.last.gc.time.seconds', + 'argo_rollouts.go.memstats.lookups.count', + 'argo_rollouts.go.memstats.mallocs.count', + 'argo_rollouts.go.memstats.mcache.inuse.bytes', + 'argo_rollouts.go.memstats.mcache.sys.bytes', + 'argo_rollouts.go.memstats.mspan.inuse.bytes', + 'argo_rollouts.go.memstats.mspan.sys.bytes', + 'argo_rollouts.go.memstats.next.gc.bytes', + 'argo_rollouts.go.memstats.other.sys.bytes', + 'argo_rollouts.go.memstats.stack.inuse.bytes', + 'argo_rollouts.go.memstats.stack.sys.bytes', + 'argo_rollouts.go.memstats.sys.bytes', + 'argo_rollouts.go.threads', + 'argo_rollouts.process.cpu.seconds.count', + 'argo_rollouts.process.max.fds', + 'argo_rollouts.process.open.fds', + 'argo_rollouts.process.resident.memory.bytes', + 'argo_rollouts.process.start.time.seconds', + 'argo_rollouts.process.virtual.memory.bytes', + 'argo_rollouts.process.virtual.memory.max.bytes', + 'argo_rollouts.workqueue.adds.count', + 'argo_rollouts.workqueue.depth', + 'argo_rollouts.workqueue.longest.running.processor.seconds', + 'argo_rollouts.workqueue.queue.duration.seconds.bucket', + 'argo_rollouts.workqueue.queue.duration.seconds.count', + 'argo_rollouts.workqueue.queue.duration.seconds.sum', + 'argo_rollouts.workqueue.retries.count', + 'argo_rollouts.workqueue.unfinished.work.seconds', + 'argo_rollouts.workqueue.work.duration.seconds.bucket', + 'argo_rollouts.workqueue.work.duration.seconds.count', + 'argo_rollouts.workqueue.work.duration.seconds.sum', +] + +def get_fixture_path(filename): + return os.path.join(HERE, 'fixtures', filename) + + diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 84952f049d121..1b85f98567320 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -3,7 +3,19 @@ # Licensed under Simplified BSD License (see LICENSE) import pytest +from datadog_checks.base.constants import ServiceCheck +from datadog_checks.dev.utils import get_metadata_metrics + +from .common import E2E_METRICS + @pytest.mark.e2e -def test_e2e_openmetrics_v1(dd_agent_check): - return {} +def test_e2e_openmetrics_v2(dd_agent_check): + aggregator = dd_agent_check(rate=True) + + aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK, count=2) + for metric in E2E_METRICS: + aggregator.assert_metric(metric) + + aggregator.assert_all_metrics_covered() + # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) \ No newline at end of file diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index cd26e7f3fa984..087a3bdbff165 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -8,19 +8,25 @@ from datadog_checks.base.stubs.aggregator import AggregatorStub # noqa: F401 from datadog_checks.dev.utils import get_metadata_metrics from datadog_checks.argo_rollouts import ArgoRolloutsCheck +import pytest +from datadog_checks.base.constants import ServiceCheck +from datadog_checks.dev.utils import get_metadata_metrics +from datadog_checks.argo_rollouts import ArgoRolloutsCheck -def test_check(dd_run_check, aggregator, instance): - # type: (Callable[[AgentCheck, bool], None], AggregatorStub, Dict[str, Any]) -> None - check = ArgoRolloutsCheck('argo_rollouts', {}, [instance]) - dd_run_check(check) - - aggregator.assert_all_metrics_covered() - aggregator.assert_metrics_using_metadata(get_metadata_metrics()) +from .common import OM_METRICS, OM_MOCKED_INSTANCE, get_fixture_path +pytestmark = pytest.mark.unit -def test_emits_critical_service_check_when_service_is_down(dd_run_check, aggregator, instance): - # type: (Callable[[AgentCheck, bool], None], AggregatorStub, Dict[str, Any]) -> None - check = ArgoRolloutsCheck('argo_rollouts', {}, [instance]) +def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_http_response): + mock_http_response(file_path=get_fixture_path('openmetrics.txt')) + check = ArgoRolloutsCheck('argo_rollouts', {}, [OM_MOCKED_INSTANCE]) dd_run_check(check) - aggregator.assert_service_check('argo_rollouts.can_connect', ArgoRolloutsCheck.CRITICAL) + + for metric in OM_METRICS: + aggregator.assert_metric(metric) + aggregator.assert_metric_has_tag(metric, 'test:tag') + + aggregator.assert_all_metrics_covered() + # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) + aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK) \ No newline at end of file From 9dcc91997b965eeb64b46bf8c9a66db628e378b8 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 28 Feb 2024 15:59:28 -0500 Subject: [PATCH 04/43] nit --- argo_rollouts/tests/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index 9cd5d79ce399f..2d39a34bbe879 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -9,7 +9,7 @@ HERE = get_here() OM_MOCKED_INSTANCE = { - 'openmetrics_endpoint': 'http://weaviate:2112/metrics', + 'openmetrics_endpoint': 'http://argo_rollouts:8090/metrics', 'tags': ['test:tag'], } From b71da1e97e5c3365bbf58adeb672075b7d974699 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 28 Feb 2024 16:03:48 -0500 Subject: [PATCH 05/43] add service check --- argo_rollouts/assets/service_checks.json | 19 ++++++++++++++++++- .../changelog.d/{1.added => 17006.added} | 0 2 files changed, 18 insertions(+), 1 deletion(-) rename argo_rollouts/changelog.d/{1.added => 17006.added} (100%) diff --git a/argo_rollouts/assets/service_checks.json b/argo_rollouts/assets/service_checks.json index fe51488c7066f..aed40f5799d83 100644 --- a/argo_rollouts/assets/service_checks.json +++ b/argo_rollouts/assets/service_checks.json @@ -1 +1,18 @@ -[] +[ + { + "agent_version": "7.53.0", + "integration": "Argo Rollouts", + "check": "argo_rollouts.openmetrics.health", + "statuses": [ + "ok", + "critical" + ], + "groups": [ + "host", + "endpoint" + ], + "name": "Argo Rollouts OpenMetrics endpoint health", + "description": "Returns `CRITICAL` if the Agent is unable to connect to the Argo Rollouts OpenMetrics endpoint, otherwise returns `OK`." + } +] + diff --git a/argo_rollouts/changelog.d/1.added b/argo_rollouts/changelog.d/17006.added similarity index 100% rename from argo_rollouts/changelog.d/1.added rename to argo_rollouts/changelog.d/17006.added From 9dff44cdaa6067bab835b5f9c94e3ff686c07ac9 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 28 Feb 2024 16:07:39 -0500 Subject: [PATCH 06/43] manifest tweaks --- argo_rollouts/manifest.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index 32758db95a10f..d2146a4ea18b9 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -8,8 +8,8 @@ "configuration": "README.md#Setup", "support": "README.md#Support", "changelog": "CHANGELOG.md", - "description": "", - "title": "Argo_Rollouts", + "description": "Argo Rollouts Integration", + "title": "Argo Rollouts", "media": [], "classifier_tags": [ "Supported OS::Linux", @@ -17,6 +17,7 @@ "Supported OS::macOS", "Category::Metrics", "Category::Kubernetes", + "Category::Developer Tools", "Category::Log Collection", "Submitted Data Type::Metrics", "Submitted Data Type::Logs" @@ -26,7 +27,7 @@ "integration": { "auto_install": true, "source_type_id": 8465752, - "source_type_name": "Argo_Rollouts", + "source_type_name": "Argo Rollouts", "configuration": { "spec": "assets/configuration/spec.yaml" }, From e9456e914890f429f8cca9235b1e907618f8d9e1 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 28 Feb 2024 16:12:12 -0500 Subject: [PATCH 07/43] validation syncs --- .codecov.yml | 9 +++++++++ .github/workflows/test-all.yml | 19 +++++++++++++++++++ argo_rollouts/CHANGELOG.md | 2 +- argo_rollouts/assets/configuration/spec.yaml | 2 +- argo_rollouts/pyproject.toml | 2 +- 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index d0e63695320ec..c79c74b5ae3ad 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -58,6 +58,10 @@ coverage: target: 75 flags: - argocd + Argo_Rollouts: + target: 75 + flags: + - argo_rollouts Avi_Vantage: target: 75 flags: @@ -700,6 +704,11 @@ flags: paths: - arangodb/datadog_checks/arangodb - arangodb/tests + argo_rollouts: + carryforward: true + paths: + - argo_rollouts/datadog_checks/argo_rollouts + - argo_rollouts/tests argocd: carryforward: true paths: diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index 2911bcb820a2e..d4a05e66897c4 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -372,6 +372,25 @@ jobs: test-py3: ${{ inputs.test-py3 }} minimum-base-package: ${{ inputs.minimum-base-package }} secrets: inherit + j3650884: + uses: ./.github/workflows/test-target.yml + with: + job-name: Argo Rollouts + target: argo_rollouts + platform: linux + runner: '["ubuntu-22.04"]' + repo: "${{ inputs.repo }}" + python-version: "${{ inputs.python-version }}" + standard: ${{ inputs.standard }} + latest: ${{ inputs.latest }} + agent-image: "${{ inputs.agent-image }}" + agent-image-py2: "${{ inputs.agent-image-py2 }}" + agent-image-windows: "${{ inputs.agent-image-windows }}" + agent-image-windows-py2: "${{ inputs.agent-image-windows-py2 }}" + test-py2: ${{ inputs.test-py2 }} + test-py3: ${{ inputs.test-py3 }} + minimum-base-package: ${{ inputs.minimum-base-package }} + secrets: inherit j92d42de: uses: ./.github/workflows/test-target.yml with: diff --git a/argo_rollouts/CHANGELOG.md b/argo_rollouts/CHANGELOG.md index c287588eabeb3..dc80cb46c2392 100644 --- a/argo_rollouts/CHANGELOG.md +++ b/argo_rollouts/CHANGELOG.md @@ -1,4 +1,4 @@ -# CHANGELOG - Argo_Rollouts +# CHANGELOG - Argo Rollouts diff --git a/argo_rollouts/assets/configuration/spec.yaml b/argo_rollouts/assets/configuration/spec.yaml index 608c831275927..9dd66704f2966 100644 --- a/argo_rollouts/assets/configuration/spec.yaml +++ b/argo_rollouts/assets/configuration/spec.yaml @@ -1,4 +1,4 @@ -name: Argo_Rollouts +name: Argo Rollouts files: - name: argo_rollouts.yaml options: diff --git a/argo_rollouts/pyproject.toml b/argo_rollouts/pyproject.toml index 3a597144bf738..219f13ff22d36 100644 --- a/argo_rollouts/pyproject.toml +++ b/argo_rollouts/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" [project] name = "datadog-argo-rollouts" -description = "The Argo_Rollouts check" +description = "The Argo Rollouts check" readme = "README.md" license = "BSD-3-Clause" requires-python = ">=3.9" From f152630f657b7d6a9278de0716c3e4a378b0bec5 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 28 Feb 2024 16:16:57 -0500 Subject: [PATCH 08/43] lint --- .../datadog_checks/argo_rollouts/check.py | 2 +- .../datadog_checks/argo_rollouts/metrics.py | 4 +- argo_rollouts/tests/common.py | 102 +++++++++--------- argo_rollouts/tests/conftest.py | 5 +- argo_rollouts/tests/test_e2e.py | 4 +- argo_rollouts/tests/test_unit.py | 11 +- 6 files changed, 63 insertions(+), 65 deletions(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/check.py b/argo_rollouts/datadog_checks/argo_rollouts/check.py index 7a80116b9d6d2..41a5b59498379 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/check.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/check.py @@ -2,8 +2,8 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) from datadog_checks.base import OpenMetricsBaseCheckV2 # noqa: F401 -from .metrics import METRIC_MAP, RENAME_LABELS_MAP +from .metrics import METRIC_MAP, RENAME_LABELS_MAP class ArgoRolloutsCheck(OpenMetricsBaseCheckV2): diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index f01c2e0713323..544d5693156f4 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -60,10 +60,10 @@ 'workqueue_queue_duration_seconds': 'workqueue.queue.duration.seconds', 'workqueue_retries': 'workqueue.retries', 'workqueue_unfinished_work_seconds': 'workqueue.unfinished.work.seconds', - 'workqueue_work_duration_seconds': 'workqueue.work.duration.seconds' + 'workqueue_work_duration_seconds': 'workqueue.work.duration.seconds', } RENAME_LABELS_MAP = { "name": "argo_rollout_name", 'namespace': 'argo_rollout_namespace', -} \ No newline at end of file +} diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index 2d39a34bbe879..13004e2d60004 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -3,7 +3,6 @@ # Licensed under a 3-clause BSD style license (see LICENSE) import os -from datadog_checks.base import is_affirmative from datadog_checks.dev import get_here HERE = get_here() @@ -80,58 +79,57 @@ ] E2E_METRICS = [ - 'argo_rollouts.conroller.info', - 'argo_rollouts.controller.clientset.k8s.request.count', - 'argo_rollouts.go.gc.duration.seconds.count', - 'argo_rollouts.go.gc.duration.seconds.quantile', - 'argo_rollouts.go.gc.duration.seconds.sum', - 'argo_rollouts.go.goroutines', - 'argo_rollouts.go.info', - 'argo_rollouts.go.memstats.alloc_bytes', - 'argo_rollouts.go.memstats.alloc_bytes.count', - 'argo_rollouts.go.memstats.buck.hash.sys.bytes', - 'argo_rollouts.go.memstats.frees.count', - 'argo_rollouts.go.memstats.gc.sys.bytes', - 'argo_rollouts.go.memstats.heap.alloc.bytes', - 'argo_rollouts.go.memstats.heap.idle.bytes', - 'argo_rollouts.go.memstats.heap.inuse.byes', - 'argo_rollouts.go.memstats.heap.objects', - 'argo_rollouts.go.memstats.heap.released.bytes', - 'argo_rollouts.go.memstats.heap.sys.bytes', - 'argo_rollouts.go.memstats.last.gc.time.seconds', - 'argo_rollouts.go.memstats.lookups.count', - 'argo_rollouts.go.memstats.mallocs.count', - 'argo_rollouts.go.memstats.mcache.inuse.bytes', - 'argo_rollouts.go.memstats.mcache.sys.bytes', - 'argo_rollouts.go.memstats.mspan.inuse.bytes', - 'argo_rollouts.go.memstats.mspan.sys.bytes', - 'argo_rollouts.go.memstats.next.gc.bytes', - 'argo_rollouts.go.memstats.other.sys.bytes', - 'argo_rollouts.go.memstats.stack.inuse.bytes', - 'argo_rollouts.go.memstats.stack.sys.bytes', - 'argo_rollouts.go.memstats.sys.bytes', - 'argo_rollouts.go.threads', - 'argo_rollouts.process.cpu.seconds.count', - 'argo_rollouts.process.max.fds', - 'argo_rollouts.process.open.fds', - 'argo_rollouts.process.resident.memory.bytes', - 'argo_rollouts.process.start.time.seconds', - 'argo_rollouts.process.virtual.memory.bytes', - 'argo_rollouts.process.virtual.memory.max.bytes', - 'argo_rollouts.workqueue.adds.count', - 'argo_rollouts.workqueue.depth', - 'argo_rollouts.workqueue.longest.running.processor.seconds', - 'argo_rollouts.workqueue.queue.duration.seconds.bucket', - 'argo_rollouts.workqueue.queue.duration.seconds.count', - 'argo_rollouts.workqueue.queue.duration.seconds.sum', - 'argo_rollouts.workqueue.retries.count', - 'argo_rollouts.workqueue.unfinished.work.seconds', - 'argo_rollouts.workqueue.work.duration.seconds.bucket', - 'argo_rollouts.workqueue.work.duration.seconds.count', - 'argo_rollouts.workqueue.work.duration.seconds.sum', + 'argo_rollouts.conroller.info', + 'argo_rollouts.controller.clientset.k8s.request.count', + 'argo_rollouts.go.gc.duration.seconds.count', + 'argo_rollouts.go.gc.duration.seconds.quantile', + 'argo_rollouts.go.gc.duration.seconds.sum', + 'argo_rollouts.go.goroutines', + 'argo_rollouts.go.info', + 'argo_rollouts.go.memstats.alloc_bytes', + 'argo_rollouts.go.memstats.alloc_bytes.count', + 'argo_rollouts.go.memstats.buck.hash.sys.bytes', + 'argo_rollouts.go.memstats.frees.count', + 'argo_rollouts.go.memstats.gc.sys.bytes', + 'argo_rollouts.go.memstats.heap.alloc.bytes', + 'argo_rollouts.go.memstats.heap.idle.bytes', + 'argo_rollouts.go.memstats.heap.inuse.byes', + 'argo_rollouts.go.memstats.heap.objects', + 'argo_rollouts.go.memstats.heap.released.bytes', + 'argo_rollouts.go.memstats.heap.sys.bytes', + 'argo_rollouts.go.memstats.last.gc.time.seconds', + 'argo_rollouts.go.memstats.lookups.count', + 'argo_rollouts.go.memstats.mallocs.count', + 'argo_rollouts.go.memstats.mcache.inuse.bytes', + 'argo_rollouts.go.memstats.mcache.sys.bytes', + 'argo_rollouts.go.memstats.mspan.inuse.bytes', + 'argo_rollouts.go.memstats.mspan.sys.bytes', + 'argo_rollouts.go.memstats.next.gc.bytes', + 'argo_rollouts.go.memstats.other.sys.bytes', + 'argo_rollouts.go.memstats.stack.inuse.bytes', + 'argo_rollouts.go.memstats.stack.sys.bytes', + 'argo_rollouts.go.memstats.sys.bytes', + 'argo_rollouts.go.threads', + 'argo_rollouts.process.cpu.seconds.count', + 'argo_rollouts.process.max.fds', + 'argo_rollouts.process.open.fds', + 'argo_rollouts.process.resident.memory.bytes', + 'argo_rollouts.process.start.time.seconds', + 'argo_rollouts.process.virtual.memory.bytes', + 'argo_rollouts.process.virtual.memory.max.bytes', + 'argo_rollouts.workqueue.adds.count', + 'argo_rollouts.workqueue.depth', + 'argo_rollouts.workqueue.longest.running.processor.seconds', + 'argo_rollouts.workqueue.queue.duration.seconds.bucket', + 'argo_rollouts.workqueue.queue.duration.seconds.count', + 'argo_rollouts.workqueue.queue.duration.seconds.sum', + 'argo_rollouts.workqueue.retries.count', + 'argo_rollouts.workqueue.unfinished.work.seconds', + 'argo_rollouts.workqueue.work.duration.seconds.bucket', + 'argo_rollouts.workqueue.work.duration.seconds.count', + 'argo_rollouts.workqueue.work.duration.seconds.sum', ] + def get_fixture_path(filename): return os.path.join(HERE, 'fixtures', filename) - - diff --git a/argo_rollouts/tests/conftest.py b/argo_rollouts/tests/conftest.py index 533f020aed360..bc034017f92d4 100644 --- a/argo_rollouts/tests/conftest.py +++ b/argo_rollouts/tests/conftest.py @@ -13,9 +13,12 @@ HERE = get_here() + def setup_argo_rollouts(): run_command(['kubectl', 'create', 'ns', 'argo-rollouts']) - run_command(['kubectl', 'apply', '-f', os.path.join(HERE, 'kind', 'argo_rollouts_install.yaml'), '-n', 'argo-rollouts']) + run_command( + ['kubectl', 'apply', '-f', os.path.join(HERE, 'kind', 'argo_rollouts_install.yaml'), '-n', 'argo-rollouts'] + ) # Tries to ensure that the Kubernetes resources are deployed and ready before we do anything else run_command(['kubectl', 'rollout', 'status', 'deployment/argo-rollouts', '-n', 'argo-rollouts']) diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 1b85f98567320..8b0db46b57e6f 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -4,8 +4,8 @@ import pytest from datadog_checks.base.constants import ServiceCheck -from datadog_checks.dev.utils import get_metadata_metrics +# from datadog_checks.dev.utils import get_metadata_metrics from .common import E2E_METRICS @@ -18,4 +18,4 @@ def test_e2e_openmetrics_v2(dd_agent_check): aggregator.assert_metric(metric) aggregator.assert_all_metrics_covered() - # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) \ No newline at end of file + # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index 087a3bdbff165..76c689ae07391 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -4,20 +4,17 @@ from typing import Any, Callable, Dict # noqa: F401 -from datadog_checks.base import AgentCheck # noqa: F401 -from datadog_checks.base.stubs.aggregator import AggregatorStub # noqa: F401 -from datadog_checks.dev.utils import get_metadata_metrics -from datadog_checks.argo_rollouts import ArgoRolloutsCheck import pytest -from datadog_checks.base.constants import ServiceCheck -from datadog_checks.dev.utils import get_metadata_metrics from datadog_checks.argo_rollouts import ArgoRolloutsCheck +from datadog_checks.base.constants import ServiceCheck +# from datadog_checks.dev.utils import get_metadata_metrics from .common import OM_METRICS, OM_MOCKED_INSTANCE, get_fixture_path pytestmark = pytest.mark.unit + def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_http_response): mock_http_response(file_path=get_fixture_path('openmetrics.txt')) check = ArgoRolloutsCheck('argo_rollouts', {}, [OM_MOCKED_INSTANCE]) @@ -29,4 +26,4 @@ def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_htt aggregator.assert_all_metrics_covered() # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) - aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK) \ No newline at end of file + aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK) From f51338f4cd9aa094f9dc1d90a1b6c469eb5850dc Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 21:47:59 -0500 Subject: [PATCH 09/43] readme --- argo_rollouts/README.md | 58 ++++++++++-- .../datadog_checks/argo_rollouts/metrics.py | 84 ++++++++--------- argo_rollouts/metadata.csv | 29 ++++++ argo_rollouts/tests/common.py | 90 +++++++++---------- argo_rollouts/tests/conftest.py | 2 +- argo_rollouts/tests/test_unit.py | 12 ++- 6 files changed, 176 insertions(+), 99 deletions(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index 0259d4e7807ae..cad0ee0f81058 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -6,18 +6,59 @@ This check monitors [Argo_Rollouts][1] through the Datadog Agent. ## Setup -Follow the instructions below to install and configure this check for an Agent running on a host. For containerized environments, see the [Autodiscovery Integration Templates][3] for guidance on applying these instructions. +Follow the instructions below to install and configure this check for an Agent running in your Kubernetes environment. For more information about configuration in containerized environments, see the [Autodiscovery Integration Templates][3] for guidance. ### Installation -The Argo_Rollouts check is included in the [Datadog Agent][2] package. -No additional installation is needed on your server. +Starting from Agent release 7.53.0, the Argo Rollouts check is included in the [Datadog Agent][2] package. No additional installation is needed in your environment. -### Configuration +This check uses [OpenMetrics][5] to collect metrics from the OpenMetrics endpoint that Karpenter exposes, which requires Python 3. -1. Edit the `argo_rollouts.d/conf.yaml` file, in the `conf.d/` folder at the root of your Agent's configuration directory to start collecting your argo_rollouts performance data. See the [sample argo_rollouts.d/conf.yaml][4] for all available configuration options. +### Configuration -2. [Restart the Agent][5]. +The Argo Rollouts controller has Prometheus formatted metrics readily available at `/metrics` on port `8090`. For the Agent to start collecting metrics, the Argo Rollouts pods need to be annotated. For more information about annotations, refer to the [Autodiscovery Integration Templates][3] for guidance. You can find additional configuration options by reviewing the [sample argo_rollouts.d/conf.yaml][4]. + +**Note**: The listed metrics can only be collected if they are available. Some metrics are generated only when certain actions are performed. For example, the `argo_rollout.info.replicas.updated` metric is exposed only after a replica is updated. + +The only parameter required for configuring the Argo Rollouts check is: +- `openmetrics_endpoint`: This parameter should be set to the location where the Prometheus-formatted metrics are exposed. The default port is `8090`. In containerized environments, `%%host%%` should be used for [host autodetection][3]. + +```yaml +apiVersion: v1 +kind: Pod +# (...) +metadata: + name: '' + annotations: + ad.datadoghq.com/argo-rollouts.checks: | + { + "argo_rollouts": { + "init_config": {}, + "instances": [ + { + "openmetrics_endpoint": "http://%%host%%:8090/metrics", + } + ] + } + } + # (...) +spec: + containers: + - name: 'argo-rollouts' +# (...) +``` + +#### Log collection + +_Available for Agent versions >6.0_ + +Argo Rollouts logs can be collected from the different Argo Rollouts pods through Kubernetes. Collecting logs is disabled by default in the Datadog Agent. To enable it, see [Kubernetes Log Collection][10]. + +See the [Autodiscovery Integration Templates][3] for guidance on applying the parameters below. + +| Parameter | Value | +| -------------- | ------------------------------------------------------- | +| `` | `{"source": "argo_rollouts", "service": ""}` | ### Validation @@ -44,12 +85,13 @@ See [service_checks.json][8] for a list of service checks provided by this integ Need help? Contact [Datadog support][9]. -[1]: **LINK_TO_INTEGRATION_SITE** +[1]: https://argoproj.github.io/rollouts/ [2]: https://app.datadoghq.com/account/settings/agent/latest [3]: https://docs.datadoghq.com/agent/kubernetes/integrations/ [4]: https://github.com/DataDog/integrations-core/blob/master/argo_rollouts/datadog_checks/argo_rollouts/data/conf.yaml.example -[5]: https://docs.datadoghq.com/agent/guide/agent-commands/#start-stop-and-restart-the-agent +[5]: https://docs.datadoghq.com/integrations/openmetrics/ [6]: https://docs.datadoghq.com/agent/guide/agent-commands/#agent-status-and-information [7]: https://github.com/DataDog/integrations-core/blob/master/argo_rollouts/metadata.csv [8]: https://github.com/DataDog/integrations-core/blob/master/argo_rollouts/assets/service_checks.json [9]: https://docs.datadoghq.com/help/ +[10]: https://docs.datadoghq.com/agent/kubernetes/log/ diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index 544d5693156f4..1ef66c25fe348 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -1,4 +1,47 @@ METRIC_MAP = { + # Generic Metrics: + 'controller_clientset_k8s_request': 'controller.clientset.k8s.request', + 'go_gc_duration_seconds': 'go.gc.duration.seconds', + 'go_goroutines': 'go.goroutines', + 'go_info': "go.info", + 'go_memstats_alloc_bytes': {'name': 'go.memstats.alloc_bytes', 'type': 'native_dynamic'}, + 'go_memstats_buck_hash_sys_bytes': 'go.memstats.buck_hash.sys_bytes', + 'go_memstats_frees': 'go.memstats.frees', + 'go_memstats_gc_cpu_fraction': 'go.memstats.gc.cpu_fraction', + 'go_memstats_gc_sys_bytes': 'go.memstats.gc.sys_bytes', + 'go_memstats_heap_alloc_bytes': 'go.memstats.heap.alloc_bytes', + 'go_memstats_heap_idle_bytes': 'go.memstats.heap.idle_bytes', + 'go_memstats_heap_inuse_bytes': 'go.memstats.heap.inuse_bytes', + 'go_memstats_heap_objects': 'go.memstats.heap.objects', + 'go_memstats_heap_released_bytes': 'go.memstats.heap.released_bytes', + 'go_memstats_heap_sys_bytes': 'go.memstats.heap.sys_bytes', + 'go_memstats_lookups': 'go.memstats.lookups', + 'go_memstats_mallocs': 'go.memstats.mallocs', + 'go_memstats_mcache_inuse_bytes': 'go.memstats.mcache.inuse_bytes', + 'go_memstats_mcache_sys_bytes': 'go.memstats.mcache.sys_bytes', + 'go_memstats_mspan_inuse_bytes': 'go.memstats.mspan.inuse_use', + 'go_memstats_mspan_sys_bytes': 'go.memstats.mspan.sys_bytes', + 'go_memstats_next_gc_bytes': 'go.memstats.next.gc_bytes', + 'go_memstats_other_sys_bytes': 'go.memstats.other.sys_bytes', + 'go_memstats_stack_inuse_bytes': 'go.memstats.stack.inuse_bytes', + 'go_memstats_stack_sys_bytes': 'go.memstats.stack.sys_bytes', + 'go_memstats_sys_bytes': 'go.memstats.sys_bytes', + 'go_threads': 'go.threads', + 'process_cpu_seconds': 'process.cpu.seconds', + 'process_max_fds': 'process.max_fds', + 'process_open_fds': 'process.open_fds', + 'process_resident_memory_bytes': 'process.resident_memory.bytes', + 'process_start_time_seconds': 'process.start_time.seconds', + 'process_virtual_memory_bytes': 'process.virtual_memory.bytes', + 'process_virtual_memory_max_bytes': 'process.virtual_memory.max_bytes', + 'workqueue_adds': 'workqueue.adds', + 'workqueue_depth': 'workqueue.depth', + 'workqueue_longest_running_processor_seconds': 'workqueue.longest.running.processor.seconds', + 'workqueue_queue_duration_seconds': 'workqueue.queue.duration.seconds', + 'workqueue_retries': 'workqueue.retries', + 'workqueue_unfinished_work_seconds': 'workqueue.unfinished.work.seconds', + 'workqueue_work_duration_seconds': 'workqueue.work.duration.seconds', + # Argo Rollouts Specific: 'analysis_run_info': 'analysis.run.info', 'analysis_run_metric_phase': 'analysis.run.metric.phase', 'analysis_run_metric_type': 'analysis.run.metric.type', @@ -6,45 +49,11 @@ 'analysis_run_reconcile': 'analysis.run.reconcile', 'analysis_run_reconcile_error': 'analysis.run.reconcile.error', 'argo_rollouts_controller_info': 'conroller.info', - 'controller_clientset_k8s_request': 'controller.clientset.k8s.request', 'experiment_info': 'experiment.info', 'experiment_phase': 'experiment.phase', 'experiment_reconcile': 'experiment.reconcile', 'experiment_reconcile_error': 'experiment.reconcile.error', - 'go_gc_duration_seconds': 'go.gc.duration.seconds', - 'go_goroutines': 'go.goroutines', - 'go_info': 'go.info', - 'go_memstats_alloc_bytes': {'name': 'go.memstats.alloc_bytes', 'type': 'native_dynamic'}, - 'go_memstats_buck_hash_sys_bytes': 'go.memstats.buck.hash.sys.bytes', - 'go_memstats_frees': 'go.memstats.frees', - 'go_memstats_gc_sys_bytes': 'go.memstats.gc.sys.bytes', - 'go_memstats_heap_alloc_bytes': 'go.memstats.heap.alloc.bytes', - 'go_memstats_heap_idle_bytes': 'go.memstats.heap.idle.bytes', - 'go_memstats_heap_inuse_bytes': 'go.memstats.heap.inuse.byes', - 'go_memstats_heap_objects': 'go.memstats.heap.objects', - 'go_memstats_heap_released_bytes': 'go.memstats.heap.released.bytes', - 'go_memstats_heap_sys_bytes': 'go.memstats.heap.sys.bytes', - 'go_memstats_last_gc_time_seconds': 'go.memstats.last.gc.time.seconds', - 'go_memstats_lookups': 'go.memstats.lookups', - 'go_memstats_mallocs': 'go.memstats.mallocs', - 'go_memstats_mcache_inuse_bytes': 'go.memstats.mcache.inuse.bytes', - 'go_memstats_mcache_sys_bytes': 'go.memstats.mcache.sys.bytes', - 'go_memstats_mspan_inuse_bytes': 'go.memstats.mspan.inuse.bytes', - 'go_memstats_mspan_sys_bytes': 'go.memstats.mspan.sys.bytes', - 'go_memstats_next_gc_bytes': 'go.memstats.next.gc.bytes', - 'go_memstats_other_sys_bytes': 'go.memstats.other.sys.bytes', - 'go_memstats_stack_inuse_bytes': 'go.memstats.stack.inuse.bytes', - 'go_memstats_stack_sys_bytes': 'go.memstats.stack.sys.bytes', - 'go_memstats_sys_bytes': 'go.memstats.sys.bytes', - 'go_threads': 'go.threads', 'notification_send': 'notification.send', - 'process_cpu_seconds': 'process.cpu.seconds', - 'process_max_fds': 'process.max.fds', - 'process_open_fds': 'process.open.fds', - 'process_resident_memory_bytes': 'process.resident.memory.bytes', - 'process_start_time_seconds': 'process.start.time.seconds', - 'process_virtual_memory_bytes': 'process.virtual.memory.bytes', - 'process_virtual_memory_max_bytes': 'process.virtual.memory.max.bytes', 'rollout_events': 'rollout.events', 'rollout_info': 'rollout.info', 'rollout_info_replicas_available': 'rollout.info.replicas.available', @@ -54,13 +63,6 @@ 'rollout_phase': 'rollout.phase', 'rollout_reconcile': 'rollout.reconcile', 'rollout_reconcile_error': 'rollout.reconcile.error', - 'workqueue_adds': 'workqueue.adds', - 'workqueue_depth': 'workqueue.depth', - 'workqueue_longest_running_processor_seconds': 'workqueue.longest.running.processor.seconds', - 'workqueue_queue_duration_seconds': 'workqueue.queue.duration.seconds', - 'workqueue_retries': 'workqueue.retries', - 'workqueue_unfinished_work_seconds': 'workqueue.unfinished.work.seconds', - 'workqueue_work_duration_seconds': 'workqueue.work.duration.seconds', } RENAME_LABELS_MAP = { diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index 6bcfec7d94d0c..af8951da7641f 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -1 +1,30 @@ metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric +argo_rollouts.go.gc.duration.seconds.count,count,,second,,The summary count of garbage collection cycles in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go gc duration seconds count, +argo_rollouts.go.gc.duration.seconds.quantile,gauge,,second,,A summary of the pause duration of garbage collection cycles in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go gc duration seconds, +argo_rollouts.go.gc.duration.seconds.sum,count,,second,,The sum of the pause duration of garbage collection cycles in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go gc duration seconds sum, +argo_rollouts.go.goroutines,gauge,,,,The number of goroutines that currently exist in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go goroutines, +argo_rollouts.go.info,gauge,,,,Metric containing the Go version as a tag,0,argo_rollouts,argo_rollouts go info, +argo_rollouts.go.memstats.alloc_bytes,gauge,,byte,,The number of bytes allocated and still in use in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats alloc_bytes, +argo_rollouts.go.memstats.alloc_bytes.count,count,,byte,,The monotonic count of bytes allocated and still in use in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats alloc_bytes, +argo_rollouts.go.memstats.buck_hash.sys_bytes,gauge,,byte,,The number of bytes used by the profiling bucket hash table in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats buck_hash sys_bytes, +argo_rollouts.go.memstats.frees.count,count,,,,The total number of frees in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats frees, +argo_rollouts.go.memstats.gc.cpu_fraction,gauge,,fraction,,The fraction of this program's available CPU time used by the GC since the program started in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats gc cpu_fraction, +argo_rollouts.go.memstats.gc.sys_bytes,gauge,,byte,,The number of bytes used for garbage collection system metadata in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats gc sys_bytes, +argo_rollouts.go.memstats.heap.alloc_bytes,gauge,,byte,,The number of heap bytes allocated and still in use in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats heap alloc_bytes, +argo_rollouts.go.memstats.heap.idle_bytes,gauge,,byte,,The number of heap bytes waiting to be used in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats heap idle_bytes, +argo_rollouts.go.memstats.heap.inuse_bytes,gauge,,byte,,The number of heap bytes that are in use in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats heap inuse_bytes, +argo_rollouts.go.memstats.heap.objects,gauge,,object,,The number of allocated objects in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats heap objects, +argo_rollouts.go.memstats.heap.released_bytes,gauge,,byte,,The number of heap bytes released to the OS in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats heap released_bytes, +argo_rollouts.go.memstats.heap.sys_bytes,gauge,,byte,,The number of heap bytes obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats heap sys_bytes, +argo_rollouts.go.memstats.lookups.count,count,,,,The number of pointer lookups,0,argo_rollouts,argo_rollouts go memstats lookups, +argo_rollouts.go.memstats.mallocs.count,count,,,,The number of mallocs,0,argo_rollouts,argo_rollouts go memstats mallocs, +argo_rollouts.go.memstats.mcache.inuse_bytes,gauge,,byte,,The number of bytes in use by mcache structures in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mcache inuse_bytes, +argo_rollouts.go.memstats.mcache.sys_bytes,gauge,,byte,,The number of bytes used for mcache structures obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mcache sys_bytes, +argo_rollouts.go.memstats.mspan.inuse_use,gauge,,byte,,The number of bytes in use by mspan structures in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mspan inuse_use, +argo_rollouts.go.memstats.mspan.sys_bytes,gauge,,byte,,The number of bytes used for mspan structures obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mspan sys_bytes, +argo_rollouts.go.memstats.next.gc_bytes,gauge,,byte,,The number of heap bytes when next garbage collection takes place in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats next gc_bytes, +argo_rollouts.go.memstats.other.sys_bytes,gauge,,byte,,The number of bytes used for other system allocations in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats other sys_bytes, +argo_rollouts.go.memstats.stack.inuse_bytes,gauge,,byte,,The number of bytes in use by the stack allocator in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats stack inuse_bytes, +argo_rollouts.go.memstats.stack.sys_bytes,gauge,,byte,,The number of bytes obtained from system for stack allocator in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats stack sys_bytes, +argo_rollouts.go.memstats.sys_bytes,gauge,,byte,,The number of bytes obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats sys_bytes, +argo_rollouts.go.threads,gauge,,thread,,The number of OS threads created in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go threads, \ No newline at end of file diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index 13004e2d60004..62411de56e3b4 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -22,38 +22,37 @@ 'argo_rollouts.go.info', 'argo_rollouts.go.memstats.alloc_bytes', 'argo_rollouts.go.memstats.alloc_bytes.count', - 'argo_rollouts.go.memstats.buck.hash.sys.bytes', + 'argo_rollouts.go.memstats.buck_hash.sys_bytes', 'argo_rollouts.go.memstats.frees.count', - 'argo_rollouts.go.memstats.gc.sys.bytes', - 'argo_rollouts.go.memstats.heap.alloc.bytes', - 'argo_rollouts.go.memstats.heap.idle.bytes', - 'argo_rollouts.go.memstats.heap.inuse.byes', + 'argo_rollouts.go.memstats.gc.sys_bytes', + 'argo_rollouts.go.memstats.heap.alloc_bytes', + 'argo_rollouts.go.memstats.heap.idle_bytes', + 'argo_rollouts.go.memstats.heap.inuse_bytes', 'argo_rollouts.go.memstats.heap.objects', - 'argo_rollouts.go.memstats.heap.released.bytes', - 'argo_rollouts.go.memstats.heap.sys.bytes', - 'argo_rollouts.go.memstats.last.gc.time.seconds', + 'argo_rollouts.go.memstats.heap.released_bytes', + 'argo_rollouts.go.memstats.heap.sys_bytes', 'argo_rollouts.go.memstats.lookups.count', 'argo_rollouts.go.memstats.mallocs.count', - 'argo_rollouts.go.memstats.mcache.inuse.bytes', - 'argo_rollouts.go.memstats.mcache.sys.bytes', - 'argo_rollouts.go.memstats.mspan.inuse.bytes', - 'argo_rollouts.go.memstats.mspan.sys.bytes', - 'argo_rollouts.go.memstats.next.gc.bytes', - 'argo_rollouts.go.memstats.other.sys.bytes', - 'argo_rollouts.go.memstats.stack.inuse.bytes', - 'argo_rollouts.go.memstats.stack.sys.bytes', - 'argo_rollouts.go.memstats.sys.bytes', + 'argo_rollouts.go.memstats.mcache.inuse_bytes', + 'argo_rollouts.go.memstats.mcache.sys_bytes', + 'argo_rollouts.go.memstats.mspan.inuse_use', + 'argo_rollouts.go.memstats.mspan.sys_bytes', + 'argo_rollouts.go.memstats.next.gc_bytes', + 'argo_rollouts.go.memstats.other.sys_bytes', + 'argo_rollouts.go.memstats.stack.inuse_bytes', + 'argo_rollouts.go.memstats.stack.sys_bytes', + 'argo_rollouts.go.memstats.sys_bytes', 'argo_rollouts.go.threads', 'argo_rollouts.notification.send.bucket', 'argo_rollouts.notification.send.count', 'argo_rollouts.notification.send.sum', 'argo_rollouts.process.cpu.seconds.count', - 'argo_rollouts.process.max.fds', - 'argo_rollouts.process.open.fds', - 'argo_rollouts.process.resident.memory.bytes', - 'argo_rollouts.process.start.time.seconds', - 'argo_rollouts.process.virtual.memory.bytes', - 'argo_rollouts.process.virtual.memory.max.bytes', + 'argo_rollouts.process.max_fds', + 'argo_rollouts.process.open_fds', + 'argo_rollouts.process.resident_memory.bytes', + 'argo_rollouts.process.start_time.seconds', + 'argo_rollouts.process.virtual_memory.bytes', + 'argo_rollouts.process.virtual_memory.max_bytes', 'argo_rollouts.rollout.events.count', 'argo_rollouts.rollout.info', 'argo_rollouts.rollout.info.replicas.available', @@ -88,35 +87,34 @@ 'argo_rollouts.go.info', 'argo_rollouts.go.memstats.alloc_bytes', 'argo_rollouts.go.memstats.alloc_bytes.count', - 'argo_rollouts.go.memstats.buck.hash.sys.bytes', + 'argo_rollouts.go.memstats.buck_hash.sys_bytes', 'argo_rollouts.go.memstats.frees.count', - 'argo_rollouts.go.memstats.gc.sys.bytes', - 'argo_rollouts.go.memstats.heap.alloc.bytes', - 'argo_rollouts.go.memstats.heap.idle.bytes', - 'argo_rollouts.go.memstats.heap.inuse.byes', + 'argo_rollouts.go.memstats.gc.sys_bytes', + 'argo_rollouts.go.memstats.heap.alloc_bytes', + 'argo_rollouts.go.memstats.heap.idle_bytes', + 'argo_rollouts.go.memstats.heap.inuse_bytes', 'argo_rollouts.go.memstats.heap.objects', - 'argo_rollouts.go.memstats.heap.released.bytes', - 'argo_rollouts.go.memstats.heap.sys.bytes', - 'argo_rollouts.go.memstats.last.gc.time.seconds', + 'argo_rollouts.go.memstats.heap.released_bytes', + 'argo_rollouts.go.memstats.heap.sys_bytes', 'argo_rollouts.go.memstats.lookups.count', 'argo_rollouts.go.memstats.mallocs.count', - 'argo_rollouts.go.memstats.mcache.inuse.bytes', - 'argo_rollouts.go.memstats.mcache.sys.bytes', - 'argo_rollouts.go.memstats.mspan.inuse.bytes', - 'argo_rollouts.go.memstats.mspan.sys.bytes', - 'argo_rollouts.go.memstats.next.gc.bytes', - 'argo_rollouts.go.memstats.other.sys.bytes', - 'argo_rollouts.go.memstats.stack.inuse.bytes', - 'argo_rollouts.go.memstats.stack.sys.bytes', - 'argo_rollouts.go.memstats.sys.bytes', + 'argo_rollouts.go.memstats.mcache.inuse_bytes', + 'argo_rollouts.go.memstats.mcache.sys_bytes', + 'argo_rollouts.go.memstats.mspan.inuse_use', + 'argo_rollouts.go.memstats.mspan.sys_bytes', + 'argo_rollouts.go.memstats.next.gc_bytes', + 'argo_rollouts.go.memstats.other.sys_bytes', + 'argo_rollouts.go.memstats.stack.inuse_bytes', + 'argo_rollouts.go.memstats.stack.sys_bytes', + 'argo_rollouts.go.memstats.sys_bytes', 'argo_rollouts.go.threads', 'argo_rollouts.process.cpu.seconds.count', - 'argo_rollouts.process.max.fds', - 'argo_rollouts.process.open.fds', - 'argo_rollouts.process.resident.memory.bytes', - 'argo_rollouts.process.start.time.seconds', - 'argo_rollouts.process.virtual.memory.bytes', - 'argo_rollouts.process.virtual.memory.max.bytes', + 'argo_rollouts.process.max_fds', + 'argo_rollouts.process.open_fds', + 'argo_rollouts.process.resident_memory.bytes', + 'argo_rollouts.process.start_time.seconds', + 'argo_rollouts.process.virtual_memory.bytes', + 'argo_rollouts.process.virtual_memory.max_bytes', 'argo_rollouts.workqueue.adds.count', 'argo_rollouts.workqueue.depth', 'argo_rollouts.workqueue.longest.running.processor.seconds', diff --git a/argo_rollouts/tests/conftest.py b/argo_rollouts/tests/conftest.py index bc034017f92d4..467f44683850b 100644 --- a/argo_rollouts/tests/conftest.py +++ b/argo_rollouts/tests/conftest.py @@ -26,7 +26,7 @@ def setup_argo_rollouts(): @pytest.fixture(scope='session') -def dd_environment(dd_save_state): +def dd_environment(): with kind_run(conditions=[setup_argo_rollouts], sleep=30) as kubeconfig, ExitStack() as stack: argo_rollouts_host, argo_rollouts_port = stack.enter_context( port_forward(kubeconfig, 'argo-rollouts', 8090, 'deployment', 'argo-rollouts') diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index 76c689ae07391..db42ad3e8bfe8 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -1,9 +1,6 @@ # (C) Datadog, Inc. 2024-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) - -from typing import Any, Callable, Dict # noqa: F401 - import pytest from datadog_checks.argo_rollouts import ArgoRolloutsCheck @@ -27,3 +24,12 @@ def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_htt aggregator.assert_all_metrics_covered() # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK) + + +def test_check_mock_invalid_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_http_response): + mock_http_response(status_code=503) + check = ArgoRolloutsCheck('argo_rollouts', {}, [OM_MOCKED_INSTANCE]) + with pytest.raises(Exception): + dd_run_check(check) + + aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.CRITICAL) From c952d86ff4ddade1bc60c1d48dab93af0e0cc952 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 22:23:21 -0500 Subject: [PATCH 10/43] metadata --- .../datadog_checks/argo_rollouts/metrics.py | 4 +- argo_rollouts/metadata.csv | 42 ++++++++++++++++++- argo_rollouts/tests/common.py | 8 ++-- argo_rollouts/tests/test_e2e.py | 4 +- argo_rollouts/tests/test_unit.py | 4 +- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index 1ef66c25fe348..2b01edfa9a16b 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -36,10 +36,10 @@ 'process_virtual_memory_max_bytes': 'process.virtual_memory.max_bytes', 'workqueue_adds': 'workqueue.adds', 'workqueue_depth': 'workqueue.depth', - 'workqueue_longest_running_processor_seconds': 'workqueue.longest.running.processor.seconds', + 'workqueue_longest_running_processor_seconds': 'workqueue.longest.running_processor.seconds', 'workqueue_queue_duration_seconds': 'workqueue.queue.duration.seconds', 'workqueue_retries': 'workqueue.retries', - 'workqueue_unfinished_work_seconds': 'workqueue.unfinished.work.seconds', + 'workqueue_unfinished_work_seconds': 'workqueue.unfinished_work.seconds', 'workqueue_work_duration_seconds': 'workqueue.work.duration.seconds', # Argo Rollouts Specific: 'analysis_run_info': 'analysis.run.info', diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index af8951da7641f..de78782e5b158 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -27,4 +27,44 @@ argo_rollouts.go.memstats.other.sys_bytes,gauge,,byte,,The number of bytes used argo_rollouts.go.memstats.stack.inuse_bytes,gauge,,byte,,The number of bytes in use by the stack allocator in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats stack inuse_bytes, argo_rollouts.go.memstats.stack.sys_bytes,gauge,,byte,,The number of bytes obtained from system for stack allocator in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats stack sys_bytes, argo_rollouts.go.memstats.sys_bytes,gauge,,byte,,The number of bytes obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats sys_bytes, -argo_rollouts.go.threads,gauge,,thread,,The number of OS threads created in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go threads, \ No newline at end of file +argo_rollouts.go.threads,gauge,,thread,,The number of OS threads created in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go threads, +argo_rollouts.workqueue.adds.count,count,,,,The total number of adds handled by workqueue,0,argo_rollouts,argo_rollouts workqueue adds, +argo_rollouts.workqueue.depth,gauge,,,,The current depth of the workqueue,0,argo_rollouts,argo_rollouts workqueue depth, +argo_rollouts.workqueue.longest.running_processor.seconds,gauge,,second,,The number of seconds the longest running worqueue processor has been running,0,argo_rollouts,argo_rollouts workqueue longest running_processor seconds, +argo_rollouts.workqueue.queue.duration.seconds.bucket,count,,second,,The histogram bucket of how long in seconds an item stays in the workqueue before being requested,0,argo_rollouts,argo_rollouts workqueue queue duration seconds bucket, +argo_rollouts.workqueue.queue.duration.seconds.count,count,,,,The total number of events in the workqueue duration histogram,0,argo_rollouts,argo_rollouts workqueue queue duration seconds count, +argo_rollouts.workqueue.queue.duration.seconds.sum,count,,,,The sum the of events counted in the workqueue duration histogram,0,argo_rollouts,argo_rollouts workqueue queue duration seconds sum, +argo_rollouts.workqueue.retries.count,count,,,,The total number of retries handled by workqueue,0,argo_rollouts,argo_rollouts workqueue retries, +argo_rollouts.workqueue.unfinished_work.seconds,gauge,,second,,The number of seconds of work that has been done that is in progress and hasn't been observed by `work_duration`. Large values indicate stuck threads. One can deduce the number of stuck threads by observing the rate at which this increases,0,argo_rollouts,argo_rollouts workqueue unfinished_work seconds, +argo_rollouts.workqueue.work.duration.seconds.bucket,count,,second,,The histogram bucket for time in seconds it takes for processing of an item in the workqueue,0,argo_rollouts,argo_rollouts workqueue work duration seconds bucket, +argo_rollouts.workqueue.work.duration.seconds.count,count,,,,The total number of events in the workqueue item processing duration histogram,0,argo_rollouts,argo_rollouts workqueue work duration seconds count, +argo_rollouts.workqueue.work.duration.seconds.sum,count,,,,The sum of events in the workqueue item processing duration histogram,0,argo_rollouts,argo_rollouts workqueue work duration seconds sum, +argo_rollouts.process.cpu.seconds.count,count,,second,,The total user and system CPU time spent in seconds in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process cpu seconds, +argo_rollouts.process.max_fds,gauge,,,,The maximum number of open file descriptors in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process max_fds, +argo_rollouts.process.open_fds,gauge,,,,The number of open file descriptors in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process open_fds, +argo_rollouts.process.resident_memory.bytes,gauge,,byte,,The resident memory size in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process resident_memory bytes, +argo_rollouts.process.start_time.seconds,gauge,,second,,The start time of the process since unix epoch in seconds in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process start_time seconds, +argo_rollouts.process.virtual_memory.bytes,gauge,,byte,,The virtual memory size in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory bytes, +argo_rollouts.process.virtual_memory.max_bytes,gauge,,byte,,The maximum amount of virtual memory available in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory max_byte, +argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, +argo_rollouts.analysis.run.info,gauge,,,,,,,, +argo_rollouts.analysis.run.metric.phase,gauge,,,,,,,, +argo_rollouts.analysis.run.metric.type,gauge,,,,,,,, +argo_rollouts.analysis.run.phase,gauge,,,,,,,, +argo_rollouts.analysis.run.reconcile,gauge,,,,,,,, +argo_rollouts.analysis.run.reconcile.error,gauge,,,,,,,, +argo_rollouts.conroller.info,gauge,,,,,,,, +argo_rollouts.experiment.info,gauge,,,,,,,, +argo_rollouts.experiment.phase,gauge,,,,,,,, +argo_rollouts.experiment.reconcile,gauge,,,,,,,, +argo_rollouts.experiment.reconcile.error,gauge,,,,,,,, +argo_rollouts.notification.send,gauge,,,,,,,, +argo_rollouts.rollout.events,gauge,,,,,,,, +argo_rollouts.rollout.info,gauge,,,,,,,, +argo_rollouts.rollout.info.replicas.available,gauge,,,,,,,, +argo_rollouts.rollout.info.replicas.desired,gauge,,,,,,,, +argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,,,,, +argo_rollouts.rollout.info.replicas.updated,gauge,,,,,,,, +argo_rollouts.rollout.phase,gauge,,,,,,,, +argo_rollouts.rollout.reconcile,gauge,,,,,,,, +argo_rollouts.rollout.reconcile.error,gauge,,,,,,,, \ No newline at end of file diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index 62411de56e3b4..4509c1c73ba50 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -66,12 +66,12 @@ 'argo_rollouts.rollout.reconcile.sum', 'argo_rollouts.workqueue.adds.count', 'argo_rollouts.workqueue.depth', - 'argo_rollouts.workqueue.longest.running.processor.seconds', + 'argo_rollouts.workqueue.longest.running_processor.seconds', 'argo_rollouts.workqueue.queue.duration.seconds.bucket', 'argo_rollouts.workqueue.queue.duration.seconds.count', 'argo_rollouts.workqueue.queue.duration.seconds.sum', 'argo_rollouts.workqueue.retries.count', - 'argo_rollouts.workqueue.unfinished.work.seconds', + 'argo_rollouts.workqueue.unfinished_work.seconds', 'argo_rollouts.workqueue.work.duration.seconds.bucket', 'argo_rollouts.workqueue.work.duration.seconds.count', 'argo_rollouts.workqueue.work.duration.seconds.sum', @@ -117,12 +117,12 @@ 'argo_rollouts.process.virtual_memory.max_bytes', 'argo_rollouts.workqueue.adds.count', 'argo_rollouts.workqueue.depth', - 'argo_rollouts.workqueue.longest.running.processor.seconds', + 'argo_rollouts.workqueue.longest.running_processor.seconds', 'argo_rollouts.workqueue.queue.duration.seconds.bucket', 'argo_rollouts.workqueue.queue.duration.seconds.count', 'argo_rollouts.workqueue.queue.duration.seconds.sum', 'argo_rollouts.workqueue.retries.count', - 'argo_rollouts.workqueue.unfinished.work.seconds', + 'argo_rollouts.workqueue.unfinished_work.seconds', 'argo_rollouts.workqueue.work.duration.seconds.bucket', 'argo_rollouts.workqueue.work.duration.seconds.count', 'argo_rollouts.workqueue.work.duration.seconds.sum', diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 8b0db46b57e6f..4739ab2408dd1 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -4,8 +4,8 @@ import pytest from datadog_checks.base.constants import ServiceCheck +from datadog_checks.dev.utils import get_metadata_metrics -# from datadog_checks.dev.utils import get_metadata_metrics from .common import E2E_METRICS @@ -18,4 +18,4 @@ def test_e2e_openmetrics_v2(dd_agent_check): aggregator.assert_metric(metric) aggregator.assert_all_metrics_covered() - # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) + aggregator.assert_metrics_using_metadata(get_metadata_metrics()) diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index db42ad3e8bfe8..003cf56af7315 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -5,8 +5,8 @@ from datadog_checks.argo_rollouts import ArgoRolloutsCheck from datadog_checks.base.constants import ServiceCheck +from datadog_checks.dev.utils import get_metadata_metrics -# from datadog_checks.dev.utils import get_metadata_metrics from .common import OM_METRICS, OM_MOCKED_INSTANCE, get_fixture_path pytestmark = pytest.mark.unit @@ -22,7 +22,7 @@ def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_htt aggregator.assert_metric_has_tag(metric, 'test:tag') aggregator.assert_all_metrics_covered() - # aggregator.assert_metrics_using_metadata(get_metadata_metrics()) + aggregator.assert_metrics_using_metadata(get_metadata_metrics()) aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK) From 1f4dc8f2b7a77b246455540f180d131286c0b60e Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 22:29:57 -0500 Subject: [PATCH 11/43] validate --- .../argo_rollouts/config_models/__init__.py | 1 - .../argo_rollouts/config_models/defaults.py | 116 ++++++++++++++++ .../argo_rollouts/config_models/instance.py | 126 +++++++++++++++++- .../argo_rollouts/config_models/shared.py | 14 +- .../datadog_checks/argo_rollouts/metrics.py | 3 + 5 files changed, 255 insertions(+), 5 deletions(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py index 2e7eff5e94dd7..106fff2032f68 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/__init__.py @@ -7,7 +7,6 @@ # ddev -x validate config -s # ddev -x validate models -s - from .instance import InstanceConfig from .shared import SharedConfig diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py index 7adf7c7b7abd3..bf7519af75f42 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/defaults.py @@ -8,9 +8,125 @@ # ddev -x validate models -s +def shared_skip_proxy(): + return False + + +def shared_timeout(): + return 10 + + +def instance_allow_redirects(): + return True + + +def instance_auth_type(): + return 'basic' + + +def instance_cache_metric_wildcards(): + return True + + +def instance_cache_shared_labels(): + return True + + +def instance_collect_counters_with_distributions(): + return False + + +def instance_collect_histogram_buckets(): + return True + + +def instance_disable_generic_tags(): + return False + + def instance_empty_default_hostname(): return False +def instance_enable_health_service_check(): + return True + + +def instance_histogram_buckets_as_distributions(): + return False + + +def instance_ignore_connection_errors(): + return False + + +def instance_kerberos_auth(): + return 'disabled' + + +def instance_kerberos_delegate(): + return False + + +def instance_kerberos_force_initiate(): + return False + + +def instance_log_requests(): + return False + + def instance_min_collection_interval(): return 15 + + +def instance_non_cumulative_histogram_buckets(): + return False + + +def instance_persist_connections(): + return False + + +def instance_request_size(): + return 16 + + +def instance_skip_proxy(): + return False + + +def instance_tag_by_endpoint(): + return True + + +def instance_telemetry(): + return False + + +def instance_timeout(): + return 10 + + +def instance_tls_ignore_warning(): + return False + + +def instance_tls_use_host_header(): + return False + + +def instance_tls_verify(): + return True + + +def instance_use_latest_spec(): + return False + + +def instance_use_legacy_auth_encoding(): + return True + + +def instance_use_process_start_time(): + return False diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py index b2d32d2e62ea8..fe33e47d77112 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/instance.py @@ -7,12 +7,12 @@ # ddev -x validate config -s # ddev -x validate models -s - from __future__ import annotations -from typing import Optional +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, ConfigDict, field_validator, model_validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -20,16 +20,136 @@ from . import defaults, validators +class AuthToken(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None + + +class ExtraMetric(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None + + +class MetricPatterns(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None + + +class Metric(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None + + +class Proxy(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None + + +class ShareLabel(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None + + class InstanceConfig(BaseModel): model_config = ConfigDict( validate_default=True, arbitrary_types_allowed=True, frozen=True, ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None + openmetrics_endpoint: str + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None @model_validator(mode='before') def _initial_validation(cls, values): diff --git a/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py b/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py index 656c417aa3849..0e8a9ecab10a2 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/config_models/shared.py @@ -7,7 +7,6 @@ # ddev -x validate config -s # ddev -x validate models -s - from __future__ import annotations from typing import Optional @@ -20,13 +19,26 @@ from . import defaults, validators +class Proxy(BaseModel): + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None + + class SharedConfig(BaseModel): model_config = ConfigDict( validate_default=True, arbitrary_types_allowed=True, frozen=True, ) + proxy: Optional[Proxy] = None service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None @model_validator(mode='before') def _initial_validation(cls, values): diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index 2b01edfa9a16b..3cfadd4b389f0 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -1,3 +1,6 @@ +# (C) Datadog, Inc. 2024-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) METRIC_MAP = { # Generic Metrics: 'controller_clientset_k8s_request': 'controller.clientset.k8s.request', From 65c52ac356d705df20189a3c969d7dbd97710c8f Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 22:34:49 -0500 Subject: [PATCH 12/43] fix metadata --- argo_rollouts/metadata.csv | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index de78782e5b158..d02f2ed0986af 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -58,13 +58,17 @@ argo_rollouts.experiment.info,gauge,,,,,,,, argo_rollouts.experiment.phase,gauge,,,,,,,, argo_rollouts.experiment.reconcile,gauge,,,,,,,, argo_rollouts.experiment.reconcile.error,gauge,,,,,,,, -argo_rollouts.notification.send,gauge,,,,,,,, -argo_rollouts.rollout.events,gauge,,,,,,,, +argo_rollouts.notification.send.bucket,count,,,,,,,, +argo_rollouts.notification.send.count,count,,,,,,,, +argo_rollouts.notification.send.sum,count,,,,,,,, +argo_rollouts.rollout.events.count,count,,,,,,,, argo_rollouts.rollout.info,gauge,,,,,,,, argo_rollouts.rollout.info.replicas.available,gauge,,,,,,,, argo_rollouts.rollout.info.replicas.desired,gauge,,,,,,,, argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,,,,, argo_rollouts.rollout.info.replicas.updated,gauge,,,,,,,, argo_rollouts.rollout.phase,gauge,,,,,,,, -argo_rollouts.rollout.reconcile,gauge,,,,,,,, -argo_rollouts.rollout.reconcile.error,gauge,,,,,,,, \ No newline at end of file +argo_rollouts.rollout.reconcile.bucket,count,,,,,,,, +argo_rollouts.rollout.reconcile.count,count,,,,,,,, +argo_rollouts.rollout.reconcile.sum,count,,,,,,,, +argo_rollouts.rollout.reconcile.error.count,count,,,,,,,, \ No newline at end of file From 8b5f554e26bd3a8285a3c24c643662f5b3dc0d58 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 22:37:09 -0500 Subject: [PATCH 13/43] remove folder --- argo_rollouts/images/IMAGES_README.md | 46 --------------------------- 1 file changed, 46 deletions(-) delete mode 100644 argo_rollouts/images/IMAGES_README.md diff --git a/argo_rollouts/images/IMAGES_README.md b/argo_rollouts/images/IMAGES_README.md deleted file mode 100644 index c915b722acace..0000000000000 --- a/argo_rollouts/images/IMAGES_README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Marketplace Media Carousel Guidelines - -## Using the media gallery - -To use the media gallery, you must upload a minimum of one image. The gallery -can hold a maximum of 8 pieces of media total, and one of these pieces of media -can be a video (guidelines and submission steps below). Images should be -added to your /images directory and referenced in the manifest.json file. - - -## Image and video requirements - -### Images - -``` -File type : .jpg or .png -File size : ~500 KB per image, with a max of 1 MB per image -File dimensions : The aspect ratio must be 16:9 minimum, with these constraints: - - Width: 1440px - Min height: 810px - Max height: 2560px - -File name : Use only letters, numbers, underscores, and hyphens -Color mode : RGB -Color profile : sRGB -Description : 300 characters maximum -``` - -### Video - -To display a video in your media gallery, please send our team the zipped file -or a link to download the video at `marketplace@datadog.com`. In addition, -please upload a thumbnail image for your video as a part of the pull request. -Once approved, we will upload the file to Vimeo and provide you with the -vimeo_id to add to your manifest.json file. Please note that the gallery can -only hold one video. - -``` -File type : MP4 H.264 -File size : Max 1 video; 1 GB maximum size -File dimensions : The aspect ratio must be exactly 16:9, and the resolution must be 1920x1080 or higher -File name : partnerName-appName.mp4 -Run time : Recommendation of 60 seconds or less -Description : 300 characters maximum -``` From 3a4354093baed3c7a79b14e3c67805538421f126 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 22:51:55 -0500 Subject: [PATCH 14/43] place holder dashboard --- .../dashboards/argo_rollouts_overview.json | 2351 +++++++++++++++++ argo_rollouts/metadata.csv | 50 +- argo_rollouts/tests/test_e2e.py | 2 +- 3 files changed, 2377 insertions(+), 26 deletions(-) diff --git a/argo_rollouts/assets/dashboards/argo_rollouts_overview.json b/argo_rollouts/assets/dashboards/argo_rollouts_overview.json index e69de29bb2d1d..9b7841f07683d 100644 --- a/argo_rollouts/assets/dashboards/argo_rollouts_overview.json +++ b/argo_rollouts/assets/dashboards/argo_rollouts_overview.json @@ -0,0 +1,2351 @@ +{ + "author_name": "Datadog", + "description": "## Argo CD Overview\n\n### The Argo CD dashboard gives you broad visibility into your Argo CD Clusters\n\nThis dashboard provides a high-level overview of your Argo CD clusters so that you can monitor the deployments, performance, and overall health of a cluster.\n\n### Useful Links\n\n- [Datadog Argo CD Integration Documentation](https://docs.datadoghq.com/integrations/argocd/)\n- [Argo CD Official Documentation](https://argo-cd.readthedocs.io/en/latest/)\n- [Monitoring Argo CD Blogpost](https://www.datadoghq.com/blog/argo-cd-datadog/)\n\nClone this template dashboard to make changes and add your own graph widgets.", + "layout_type": "ordered", + "template_variables": [ + { + "available_values": [], + "default": "*", + "name": "host", + "prefix": "host" + }, + { + "available_values": [], + "default": "*", + "name": "kube_cluster_name", + "prefix": "kube_cluster_name" + }, + { + "available_values": [], + "default": "*", + "name": "kube_namespace", + "prefix": "kube_namespace" + }, + { + "available_values": [], + "default": "*", + "name": "health_status", + "prefix": "health_status" + }, + { + "available_values": [], + "default": "*", + "name": "repo", + "prefix": "repo" + } + ], + "title": "Argo CD Overview", + "widgets": [ + { + "definition": { + "banner_img": "/static/images/logos/argocd_large.svg", + "layout_type": "ordered", + "show_title": false, + "title": "Overview", + "type": "group", + "widgets": [ + { + "definition": { + "background_color": "transparent", + "content": "This dashboard provides a high-level overview of your Argo CD clusters so that you can monitor the deployments, performance, and overall health of a cluster\n\nUsing the dashboard, you can monitor the health of\n* Application Controller\n* API Server\n* Repository Server", + "font_size": "14", + "has_padding": true, + "show_tick": false, + "text_align": "left", + "tick_edge": "left", + "tick_pos": "50%", + "type": "note", + "vertical_align": "center" + }, + "id": 7137252396065106, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "background_color": "transparent", + "content": "\n### Useful Links\n- [Datadog Argo CD Integration Documentation](https://docs.datadoghq.com/integrations/argocd/)\n- [Argo CD Official Documentation](https://argo-cd.readthedocs.io/en/latest/)\n- [Monitor Argo CD Blogpost](https://www.datadoghq.com/blog/argo-cd-datadog/)", + "font_size": "14", + "has_padding": true, + "show_tick": false, + "text_align": "left", + "tick_edge": "left", + "tick_pos": "50%", + "type": "note", + "vertical_align": "top" + }, + "id": 5723783152443636, + "layout": { + "height": 2, + "width": 6, + "x": 0, + "y": 3 + } + } + ] + }, + "id": 8741772350597652, + "layout": { + "height": 8, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "background_color": "vivid_blue", + "layout_type": "ordered", + "show_title": true, + "title": "Overview", + "type": "group", + "widgets": [ + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Number of Applications", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.info{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {host}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "blue" + } + } + ], + "show_legend": true, + "title": "Number of Applications", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1107851890687136, + "layout": { + "height": 2, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "autoscale": true, + "precision": 2, + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "aggregator": "max", + "data_source": "metrics", + "name": "query1", + "query": "count:argocd.app_controller.go.goroutines{$host,$kube_cluster_name,$kube_namespace}" + } + ], + "response_format": "scalar" + } + ], + "title": "App Controllers", + "title_align": "left", + "title_size": "16", + "type": "query_value" + }, + "id": 8391951914104866, + "layout": { + "height": 2, + "width": 2, + "x": 0, + "y": 2 + } + }, + { + "definition": { + "autoscale": true, + "precision": 2, + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "aggregator": "max", + "data_source": "metrics", + "name": "query1", + "query": "count:argocd.repo_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace}" + } + ], + "response_format": "scalar" + } + ], + "title": "Repository Servers", + "title_align": "left", + "title_size": "16", + "type": "query_value" + }, + "id": 3083362413703058, + "layout": { + "height": 2, + "width": 2, + "x": 2, + "y": 2 + } + }, + { + "definition": { + "autoscale": true, + "precision": 2, + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "aggregator": "max", + "data_source": "metrics", + "name": "query1", + "query": "count:argocd.api_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace}" + } + ], + "response_format": "scalar" + } + ], + "title": "API Servers", + "title_align": "left", + "title_size": "16", + "type": "query_value" + }, + "id": 2764269609392968, + "layout": { + "height": 2, + "width": 2, + "x": 4, + "y": 2 + } + }, + { + "definition": { + "group": [ + "cluster_name" + ], + "no_group_hosts": true, + "no_metric_hosts": true, + "node_type": "host", + "requests": { + "fill": { + "q": "avg:system.load.1{field:apps:argocd,$host,$kube_cluster_name,$kube_namespace} by {host}" + } + }, + "scope": [ + "field:apps:argocd" + ], + "style": { + "palette": "green_to_orange", + "palette_flip": false + }, + "title": "Host Reporting Argo CD Metrics by Cluster", + "title_align": "left", + "title_size": "16", + "type": "hostmap" + }, + "id": 148852812141642, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 4 + } + } + ] + }, + "id": 2293131439045202, + "layout": { + "height": 8, + "width": 6, + "x": 6, + "y": 0 + } + }, + { + "definition": { + "background_color": "vivid_green", + "layout_type": "ordered", + "show_title": true, + "title": "Application Status", + "type": "group", + "widgets": [ + { + "definition": { + "hide_total": false, + "legend": { + "type": "table" + }, + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "aggregator": "avg", + "data_source": "metrics", + "name": "query1", + "query": "count:argocd.app_controller.app.info{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {repo,host,name}" + } + ], + "response_format": "scalar" + } + ], + "title": "Applications by Repositories", + "title_align": "left", + "title_size": "16", + "type": "sunburst" + }, + "id": 4761912700194790, + "layout": { + "height": 4, + "width": 12, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "horizontal", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Number of Applications", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.info{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {sync_status}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Number of Applications", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 7617765285986134, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 4 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Application not Synced", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.info{!sync_status:synced,$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {sync_status,host,name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Applications Not in Sync by Sync_Status & Host", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 8732078285048376, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 4 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Application Syncs", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.sync.count{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "blue" + } + } + ], + "show_legend": true, + "title": "Number of Application Syncs", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 4491005302659932, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 7 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Unsuccessful Syncs", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.sync.count{!phase:succeeded,$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {phase,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "blue" + } + } + ], + "show_legend": true, + "title": "Number of Non Successful Application Syncs", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 3479937394251732, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 7 + } + }, + { + "definition": { + "background_color": "green", + "content": "Application Controller Telemetry", + "font_size": "18", + "has_padding": true, + "show_tick": false, + "text_align": "center", + "tick_edge": "left", + "tick_pos": "50%", + "type": "note", + "vertical_align": "center" + }, + "id": 2091528630387406, + "layout": { + "height": 1, + "width": 12, + "x": 0, + "y": 10 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Memory Allocated", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.app_controller.go.memstats.heap.alloc_bytes{$host,$kube_cluster_name,$kube_namespace} by {cluster_name,host}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Application Controller Memory Usage by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 4927792811835832, + "layout": { + "height": 3, + "width": 4, + "x": 0, + "y": 11 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Goroutines", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.app_controller.go.goroutines{$host,$kube_cluster_name,$kube_namespace} by {kube_namespace,host}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Application Controller Goroutines Usage by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 6525343257017112, + "layout": { + "height": 3, + "width": 4, + "x": 4, + "y": 11 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "CPU Time", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.process.cpu.seconds.count{$host,$kube_cluster_name,$kube_namespace} by {kube_namespace,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Application Controller CPU Time by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 3471621043457984, + "layout": { + "height": 3, + "width": 4, + "x": 8, + "y": 11 + } + } + ] + }, + "id": 3103904444573384, + "layout": { + "height": 15, + "width": 12, + "x": 0, + "y": 8 + } + }, + { + "definition": { + "background_color": "vivid_orange", + "layout_type": "ordered", + "show_title": true, + "title": "Controller Stats", + "type": "group", + "widgets": [ + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Application Reconciliation", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.reconcile.count{$host,$kube_cluster_name,$kube_namespace} by {namespace,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "orange" + } + } + ], + "show_legend": true, + "title": "Count of Application Reconciliation", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1683090577470882, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Reconciliation Duration", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.reconcile.bucket{$host,$kube_cluster_name,$kube_namespace} by {upper_bound,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "orange" + } + } + ], + "show_legend": true, + "title": "Count of Application Reconciliation by Duration Bounds", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 2882037992742898, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Workqueue depth", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.workqueue.depth{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "palette": "orange" + } + } + ], + "show_legend": true, + "title": "Depth of the Workqueue", + "title_align": "left", + "title_size": "16", + "type": "timeseries", + "yaxis": { + "include_zero": true, + "max": "auto", + "min": "auto", + "scale": "linear" + } + }, + "id": 2092421836560578, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Kubectl Request Executed", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.app.k8s.request.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "palette": "orange" + } + } + ], + "show_legend": true, + "title": "Count of Kubernetes Requests Executed", + "title_align": "left", + "title_size": "16", + "type": "timeseries", + "yaxis": { + "include_zero": true, + "max": "auto", + "min": "auto", + "scale": "linear" + } + }, + "id": 4125569125075486, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Kubectl Execution", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.kubectl.exec.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "palette": "orange" + } + } + ], + "show_legend": true, + "title": "Count of Kubectl Executions", + "title_align": "left", + "title_size": "16", + "type": "timeseries", + "yaxis": { + "include_zero": true, + "max": "auto", + "min": "auto", + "scale": "linear" + } + }, + "id": 6916335121689932, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 6 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Pending Kubectl Execution", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.app_controller.kubectl.exec.pending{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "palette": "orange" + } + } + ], + "show_legend": true, + "title": "Count of Pending Kubectl Executions", + "title_align": "left", + "title_size": "16", + "type": "timeseries", + "yaxis": { + "include_zero": true, + "max": "auto", + "min": "auto", + "scale": "linear" + } + }, + "id": 1713544962494578, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 6 + } + } + ] + }, + "id": 8970831812548910, + "layout": { + "height": 10, + "width": 12, + "x": 0, + "y": 23 + } + }, + { + "definition": { + "background_color": "vivid_purple", + "layout_type": "ordered", + "show_title": true, + "title": "Server Stats", + "type": "group", + "widgets": [ + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "All Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{$host,$kube_cluster_name,$kube_namespace} by {grpc_service,kube_cluster_name,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Service Requests by Service", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 7853075716472980, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Cluster Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:cluster.clusterservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Cluster Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 2986577135722696, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Application Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:application.applicationservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Application Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 4161309530762940, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Repository Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:repository.repositoryservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Repository Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 3346295316212716, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Session Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:session.sessionservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Session Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 251735075640654, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 6 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Version Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:version.versionservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Version Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 6377937600157456, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 6 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Account Service Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:account.accountservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name,host}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Account Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 8207475356653118, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 9 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Settings Service Request ", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:cluster.settingsservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "purple" + } + } + ], + "show_legend": true, + "title": "Count of Settings Service Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 5496058710860268, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 9 + } + }, + { + "definition": { + "background_color": "purple", + "content": "API Server Telemetry", + "font_size": "18", + "has_padding": true, + "show_tick": false, + "text_align": "center", + "tick_edge": "left", + "tick_pos": "50%", + "type": "note", + "vertical_align": "center" + }, + "id": 3658743930291138, + "layout": { + "height": 1, + "width": 12, + "x": 0, + "y": 12 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Memory Allocated", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.api_server.go.memstats.heap.alloc_bytes{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "API Server Memory Usage by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 5099362422931018, + "layout": { + "height": 3, + "width": 4, + "x": 0, + "y": 13 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Goroutines", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.api_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "API Server Goroutines Usage by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 5166753638637396, + "layout": { + "height": 3, + "width": 4, + "x": 4, + "y": 13 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "CPU Time", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.api_server.process.cpu.seconds.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "API Server CPU Time by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 6597509157761322, + "layout": { + "height": 3, + "width": 4, + "x": 8, + "y": 13 + } + } + ] + }, + "id": 2661663506447074, + "layout": { + "height": 17, + "width": 12, + "x": 0, + "y": 33 + } + }, + { + "definition": { + "background_color": "vivid_orange", + "layout_type": "ordered", + "show_title": true, + "title": "Repository Server Stats", + "type": "group", + "widgets": [ + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Ls-remote Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.repo_server.git.request.count{request_type:ls-remote,$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Count of Git Ls-Remote Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 8507386561737364, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.repo_server.git.request.duration.seconds.bucket{request_type:ls-remote,$host,$kube_cluster_name,$kube_namespace} by {upper_bound,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Git Ls-Remote Requests Performance", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 5597200409579852, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Fetch Request", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.repo_server.git.request.count{request_type:fetch,$host,$kube_cluster_name,$kube_namespace}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Count of Git Fetch Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1635931665551580, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.repo_server.git.request.duration.seconds.bucket{request_type:fetch,kube_cluster_name,$host,$kube_cluster_name,$kube_namespace}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Fetch Git Requests Performance", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1418427818359380, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Request", + "formula": "query2" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query2", + "query": "sum:argocd.api_server.redis.request.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Count of of Redis Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1888889021360466, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 6 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Number of Requests Failures", + "formula": "query2" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query2", + "query": "sum:argocd.api_server.redis.request.count{failed:true,$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Number of Failed Redis Requests", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1452795846002068, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 6 + } + }, + { + "definition": { + "background_color": "orange", + "content": "Repository Server Telemetry", + "font_size": "18", + "has_padding": true, + "show_tick": false, + "text_align": "center", + "tick_edge": "left", + "tick_pos": "50%", + "type": "note", + "vertical_align": "center" + }, + "id": 915681521277132, + "layout": { + "height": 1, + "width": 12, + "x": 0, + "y": 9 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Memory Allocated", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.repo_server.go.memstats.heap.alloc_bytes{$host,$kube_cluster_name,$kube_namespace} by {kube_cluster_name,host}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Repository Server Memory Usage by Cluster", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 4222714840704378, + "layout": { + "height": 3, + "width": 4, + "x": 0, + "y": 10 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Goroutines", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.repo_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Repository Server Goroutines Usage", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1739824276453470, + "layout": { + "height": 3, + "width": 4, + "x": 4, + "y": 10 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "CPU Time", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "sum:argocd.repo_server.process.cpu.seconds.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "dog_classic" + } + } + ], + "show_legend": true, + "title": "Repository Server CPU Time", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 7302272394223286, + "layout": { + "height": 3, + "width": 4, + "x": 8, + "y": 10 + } + } + ] + }, + "id": 444244913319832, + "layout": { + "height": 14, + "width": 12, + "x": 0, + "y": 50 + } + }, + { + "definition": { + "background_color": "vivid_green", + "layout_type": "ordered", + "show_title": true, + "title": "Cluster Stats", + "type": "group", + "widgets": [ + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "API Resource Object", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.app_controller.cluster.api.resource_objects{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "green" + } + } + ], + "show_legend": true, + "title": "Count of Cluster Resource Objects", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 877335939374388, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "API Resource", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.app_controller.cluster_api_resources{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "green" + } + } + ], + "show_legend": true, + "title": "Count of API Resources", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 6895703789485698, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 0 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "bars", + "formulas": [ + { + "alias": "Cluster Event", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.app_controller.cluster.events.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "green" + } + } + ], + "show_legend": true, + "title": "Count of Cluster Events", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 8008111599023896, + "layout": { + "height": 3, + "width": 6, + "x": 0, + "y": 3 + } + }, + { + "definition": { + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "legend_layout": "auto", + "requests": [ + { + "display_type": "line", + "formulas": [ + { + "alias": "Cluster Cache Age", + "formula": "query1" + } + ], + "queries": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:argocd.app_controller.cluster.cache.age.seconds{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" + } + ], + "response_format": "timeseries", + "style": { + "line_type": "solid", + "line_width": "normal", + "palette": "green" + } + } + ], + "show_legend": true, + "title": "Age of Cluster Cache", + "title_align": "left", + "title_size": "16", + "type": "timeseries" + }, + "id": 1101747570951110, + "layout": { + "height": 3, + "width": 6, + "x": 6, + "y": 3 + } + } + ] + }, + "id": 5257189791506674, + "layout": { + "height": 7, + "is_column_break": true, + "width": 12, + "x": 0, + "y": 64 + } + }, + { + "definition": { + "background_color": "vivid_blue", + "layout_type": "ordered", + "show_title": true, + "title": "Logs", + "type": "group", + "widgets": [ + { + "definition": { + "requests": [ + { + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "timestamp", + "width": "auto" + }, + { + "field": "host", + "width": "auto" + }, + { + "field": "service", + "width": "auto" + }, + { + "field": "content", + "width": "compact" + } + ], + "query": { + "data_source": "logs_stream", + "indexes": [], + "query_string": "source:argocd", + "sort": { + "column": "timestamp", + "order": "desc" + }, + "storage": "hot" + }, + "response_format": "event_list" + } + ], + "title": "", + "title_align": "left", + "title_size": "16", + "type": "list_stream" + }, + "id": 7799454257481500, + "layout": { + "height": 3, + "width": 12, + "x": 0, + "y": 0 + } + } + ] + }, + "id": 5039638453713644, + "layout": { + "height": 4, + "width": 12, + "x": 0, + "y": 71 + } + } + ] +} \ No newline at end of file diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index d02f2ed0986af..c4ad36789bce1 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -47,28 +47,28 @@ argo_rollouts.process.start_time.seconds,gauge,,second,,The start time of the pr argo_rollouts.process.virtual_memory.bytes,gauge,,byte,,The virtual memory size in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory bytes, argo_rollouts.process.virtual_memory.max_bytes,gauge,,byte,,The maximum amount of virtual memory available in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory max_byte, argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, -argo_rollouts.analysis.run.info,gauge,,,,,,,, -argo_rollouts.analysis.run.metric.phase,gauge,,,,,,,, -argo_rollouts.analysis.run.metric.type,gauge,,,,,,,, -argo_rollouts.analysis.run.phase,gauge,,,,,,,, -argo_rollouts.analysis.run.reconcile,gauge,,,,,,,, -argo_rollouts.analysis.run.reconcile.error,gauge,,,,,,,, -argo_rollouts.conroller.info,gauge,,,,,,,, -argo_rollouts.experiment.info,gauge,,,,,,,, -argo_rollouts.experiment.phase,gauge,,,,,,,, -argo_rollouts.experiment.reconcile,gauge,,,,,,,, -argo_rollouts.experiment.reconcile.error,gauge,,,,,,,, -argo_rollouts.notification.send.bucket,count,,,,,,,, -argo_rollouts.notification.send.count,count,,,,,,,, -argo_rollouts.notification.send.sum,count,,,,,,,, -argo_rollouts.rollout.events.count,count,,,,,,,, -argo_rollouts.rollout.info,gauge,,,,,,,, -argo_rollouts.rollout.info.replicas.available,gauge,,,,,,,, -argo_rollouts.rollout.info.replicas.desired,gauge,,,,,,,, -argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,,,,, -argo_rollouts.rollout.info.replicas.updated,gauge,,,,,,,, -argo_rollouts.rollout.phase,gauge,,,,,,,, -argo_rollouts.rollout.reconcile.bucket,count,,,,,,,, -argo_rollouts.rollout.reconcile.count,count,,,,,,,, -argo_rollouts.rollout.reconcile.sum,count,,,,,,,, -argo_rollouts.rollout.reconcile.error.count,count,,,,,,,, \ No newline at end of file +argo_rollouts.analysis.run.info,gauge,,,,,,argo_rollouts,, +argo_rollouts.analysis.run.metric.phase,gauge,,,,,,argo_rollouts,, +argo_rollouts.analysis.run.metric.type,gauge,,,,,,argo_rollouts,, +argo_rollouts.analysis.run.phase,gauge,,,,,,argo_rollouts,, +argo_rollouts.analysis.run.reconcile,gauge,,,,,,argo_rollouts,, +argo_rollouts.analysis.run.reconcile.error,gauge,,,,,,argo_rollouts,, +argo_rollouts.conroller.info,gauge,,,,,,argo_rollouts,, +argo_rollouts.experiment.info,gauge,,,,,,argo_rollouts,, +argo_rollouts.experiment.phase,gauge,,,,,,argo_rollouts,, +argo_rollouts.experiment.reconcile,gauge,,,,,,argo_rollouts,, +argo_rollouts.experiment.reconcile.error,gauge,,,,,,argo_rollouts,, +argo_rollouts.notification.send.bucket,count,,,,,,argo_rollouts,, +argo_rollouts.notification.send.count,count,,,,,,argo_rollouts,, +argo_rollouts.notification.send.sum,count,,,,,,argo_rollouts,, +argo_rollouts.rollout.events.count,count,,,,,,argo_rollouts,, +argo_rollouts.rollout.info,gauge,,,,,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.available,gauge,,,,,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.desired,gauge,,,,,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.updated,gauge,,,,,,argo_rollouts,, +argo_rollouts.rollout.phase,gauge,,,,,,argo_rollouts,, +argo_rollouts.rollout.reconcile.bucket,count,,,,,,argo_rollouts,, +argo_rollouts.rollout.reconcile.count,count,,,,,,argo_rollouts,, +argo_rollouts.rollout.reconcile.sum,count,,,,,,argo_rollouts,, +argo_rollouts.rollout.reconcile.error.count,count,,,,,,argo_rollouts,, \ No newline at end of file diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 4739ab2408dd1..7a49842fc0321 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -1,6 +1,6 @@ # (C) Datadog, Inc. 2024-present # All rights reserved -# Licensed under Simplified BSD License (see LICENSE) +# Licensed under a 3-clause BSD style license (see LICENSE) import pytest from datadog_checks.base.constants import ServiceCheck From d0b3dfd0227cb341f3bb8bc09fc3b931ef351ed3 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 22:57:50 -0500 Subject: [PATCH 15/43] place holder dashboard --- .../dashboards/argo_rollouts_overview.json | 2351 ----------------- argo_rollouts/assets/dashboards/overview.json | 41 + argo_rollouts/manifest.json | 4 +- 3 files changed, 44 insertions(+), 2352 deletions(-) delete mode 100644 argo_rollouts/assets/dashboards/argo_rollouts_overview.json create mode 100644 argo_rollouts/assets/dashboards/overview.json diff --git a/argo_rollouts/assets/dashboards/argo_rollouts_overview.json b/argo_rollouts/assets/dashboards/argo_rollouts_overview.json deleted file mode 100644 index 9b7841f07683d..0000000000000 --- a/argo_rollouts/assets/dashboards/argo_rollouts_overview.json +++ /dev/null @@ -1,2351 +0,0 @@ -{ - "author_name": "Datadog", - "description": "## Argo CD Overview\n\n### The Argo CD dashboard gives you broad visibility into your Argo CD Clusters\n\nThis dashboard provides a high-level overview of your Argo CD clusters so that you can monitor the deployments, performance, and overall health of a cluster.\n\n### Useful Links\n\n- [Datadog Argo CD Integration Documentation](https://docs.datadoghq.com/integrations/argocd/)\n- [Argo CD Official Documentation](https://argo-cd.readthedocs.io/en/latest/)\n- [Monitoring Argo CD Blogpost](https://www.datadoghq.com/blog/argo-cd-datadog/)\n\nClone this template dashboard to make changes and add your own graph widgets.", - "layout_type": "ordered", - "template_variables": [ - { - "available_values": [], - "default": "*", - "name": "host", - "prefix": "host" - }, - { - "available_values": [], - "default": "*", - "name": "kube_cluster_name", - "prefix": "kube_cluster_name" - }, - { - "available_values": [], - "default": "*", - "name": "kube_namespace", - "prefix": "kube_namespace" - }, - { - "available_values": [], - "default": "*", - "name": "health_status", - "prefix": "health_status" - }, - { - "available_values": [], - "default": "*", - "name": "repo", - "prefix": "repo" - } - ], - "title": "Argo CD Overview", - "widgets": [ - { - "definition": { - "banner_img": "/static/images/logos/argocd_large.svg", - "layout_type": "ordered", - "show_title": false, - "title": "Overview", - "type": "group", - "widgets": [ - { - "definition": { - "background_color": "transparent", - "content": "This dashboard provides a high-level overview of your Argo CD clusters so that you can monitor the deployments, performance, and overall health of a cluster\n\nUsing the dashboard, you can monitor the health of\n* Application Controller\n* API Server\n* Repository Server", - "font_size": "14", - "has_padding": true, - "show_tick": false, - "text_align": "left", - "tick_edge": "left", - "tick_pos": "50%", - "type": "note", - "vertical_align": "center" - }, - "id": 7137252396065106, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "background_color": "transparent", - "content": "\n### Useful Links\n- [Datadog Argo CD Integration Documentation](https://docs.datadoghq.com/integrations/argocd/)\n- [Argo CD Official Documentation](https://argo-cd.readthedocs.io/en/latest/)\n- [Monitor Argo CD Blogpost](https://www.datadoghq.com/blog/argo-cd-datadog/)", - "font_size": "14", - "has_padding": true, - "show_tick": false, - "text_align": "left", - "tick_edge": "left", - "tick_pos": "50%", - "type": "note", - "vertical_align": "top" - }, - "id": 5723783152443636, - "layout": { - "height": 2, - "width": 6, - "x": 0, - "y": 3 - } - } - ] - }, - "id": 8741772350597652, - "layout": { - "height": 8, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "background_color": "vivid_blue", - "layout_type": "ordered", - "show_title": true, - "title": "Overview", - "type": "group", - "widgets": [ - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Number of Applications", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.info{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {host}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "blue" - } - } - ], - "show_legend": true, - "title": "Number of Applications", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1107851890687136, - "layout": { - "height": 2, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "autoscale": true, - "precision": 2, - "requests": [ - { - "formulas": [ - { - "formula": "query1" - } - ], - "queries": [ - { - "aggregator": "max", - "data_source": "metrics", - "name": "query1", - "query": "count:argocd.app_controller.go.goroutines{$host,$kube_cluster_name,$kube_namespace}" - } - ], - "response_format": "scalar" - } - ], - "title": "App Controllers", - "title_align": "left", - "title_size": "16", - "type": "query_value" - }, - "id": 8391951914104866, - "layout": { - "height": 2, - "width": 2, - "x": 0, - "y": 2 - } - }, - { - "definition": { - "autoscale": true, - "precision": 2, - "requests": [ - { - "formulas": [ - { - "formula": "query1" - } - ], - "queries": [ - { - "aggregator": "max", - "data_source": "metrics", - "name": "query1", - "query": "count:argocd.repo_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace}" - } - ], - "response_format": "scalar" - } - ], - "title": "Repository Servers", - "title_align": "left", - "title_size": "16", - "type": "query_value" - }, - "id": 3083362413703058, - "layout": { - "height": 2, - "width": 2, - "x": 2, - "y": 2 - } - }, - { - "definition": { - "autoscale": true, - "precision": 2, - "requests": [ - { - "formulas": [ - { - "formula": "query1" - } - ], - "queries": [ - { - "aggregator": "max", - "data_source": "metrics", - "name": "query1", - "query": "count:argocd.api_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace}" - } - ], - "response_format": "scalar" - } - ], - "title": "API Servers", - "title_align": "left", - "title_size": "16", - "type": "query_value" - }, - "id": 2764269609392968, - "layout": { - "height": 2, - "width": 2, - "x": 4, - "y": 2 - } - }, - { - "definition": { - "group": [ - "cluster_name" - ], - "no_group_hosts": true, - "no_metric_hosts": true, - "node_type": "host", - "requests": { - "fill": { - "q": "avg:system.load.1{field:apps:argocd,$host,$kube_cluster_name,$kube_namespace} by {host}" - } - }, - "scope": [ - "field:apps:argocd" - ], - "style": { - "palette": "green_to_orange", - "palette_flip": false - }, - "title": "Host Reporting Argo CD Metrics by Cluster", - "title_align": "left", - "title_size": "16", - "type": "hostmap" - }, - "id": 148852812141642, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 4 - } - } - ] - }, - "id": 2293131439045202, - "layout": { - "height": 8, - "width": 6, - "x": 6, - "y": 0 - } - }, - { - "definition": { - "background_color": "vivid_green", - "layout_type": "ordered", - "show_title": true, - "title": "Application Status", - "type": "group", - "widgets": [ - { - "definition": { - "hide_total": false, - "legend": { - "type": "table" - }, - "requests": [ - { - "formulas": [ - { - "formula": "query1" - } - ], - "queries": [ - { - "aggregator": "avg", - "data_source": "metrics", - "name": "query1", - "query": "count:argocd.app_controller.app.info{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {repo,host,name}" - } - ], - "response_format": "scalar" - } - ], - "title": "Applications by Repositories", - "title_align": "left", - "title_size": "16", - "type": "sunburst" - }, - "id": 4761912700194790, - "layout": { - "height": 4, - "width": 12, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "horizontal", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Number of Applications", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.info{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {sync_status}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Number of Applications", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 7617765285986134, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 4 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Application not Synced", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.info{!sync_status:synced,$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {sync_status,host,name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Applications Not in Sync by Sync_Status & Host", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 8732078285048376, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 4 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Application Syncs", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.sync.count{$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "blue" - } - } - ], - "show_legend": true, - "title": "Number of Application Syncs", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 4491005302659932, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 7 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Unsuccessful Syncs", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.sync.count{!phase:succeeded,$host,$kube_cluster_name,$health_status,$kube_namespace,$repo} by {phase,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "blue" - } - } - ], - "show_legend": true, - "title": "Number of Non Successful Application Syncs", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 3479937394251732, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 7 - } - }, - { - "definition": { - "background_color": "green", - "content": "Application Controller Telemetry", - "font_size": "18", - "has_padding": true, - "show_tick": false, - "text_align": "center", - "tick_edge": "left", - "tick_pos": "50%", - "type": "note", - "vertical_align": "center" - }, - "id": 2091528630387406, - "layout": { - "height": 1, - "width": 12, - "x": 0, - "y": 10 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Memory Allocated", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.app_controller.go.memstats.heap.alloc_bytes{$host,$kube_cluster_name,$kube_namespace} by {cluster_name,host}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Application Controller Memory Usage by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 4927792811835832, - "layout": { - "height": 3, - "width": 4, - "x": 0, - "y": 11 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Goroutines", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.app_controller.go.goroutines{$host,$kube_cluster_name,$kube_namespace} by {kube_namespace,host}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Application Controller Goroutines Usage by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 6525343257017112, - "layout": { - "height": 3, - "width": 4, - "x": 4, - "y": 11 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "CPU Time", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.process.cpu.seconds.count{$host,$kube_cluster_name,$kube_namespace} by {kube_namespace,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Application Controller CPU Time by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 3471621043457984, - "layout": { - "height": 3, - "width": 4, - "x": 8, - "y": 11 - } - } - ] - }, - "id": 3103904444573384, - "layout": { - "height": 15, - "width": 12, - "x": 0, - "y": 8 - } - }, - { - "definition": { - "background_color": "vivid_orange", - "layout_type": "ordered", - "show_title": true, - "title": "Controller Stats", - "type": "group", - "widgets": [ - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Application Reconciliation", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.reconcile.count{$host,$kube_cluster_name,$kube_namespace} by {namespace,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "orange" - } - } - ], - "show_legend": true, - "title": "Count of Application Reconciliation", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1683090577470882, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Reconciliation Duration", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.reconcile.bucket{$host,$kube_cluster_name,$kube_namespace} by {upper_bound,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "orange" - } - } - ], - "show_legend": true, - "title": "Count of Application Reconciliation by Duration Bounds", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 2882037992742898, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Workqueue depth", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.workqueue.depth{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "palette": "orange" - } - } - ], - "show_legend": true, - "title": "Depth of the Workqueue", - "title_align": "left", - "title_size": "16", - "type": "timeseries", - "yaxis": { - "include_zero": true, - "max": "auto", - "min": "auto", - "scale": "linear" - } - }, - "id": 2092421836560578, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Kubectl Request Executed", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.app.k8s.request.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "palette": "orange" - } - } - ], - "show_legend": true, - "title": "Count of Kubernetes Requests Executed", - "title_align": "left", - "title_size": "16", - "type": "timeseries", - "yaxis": { - "include_zero": true, - "max": "auto", - "min": "auto", - "scale": "linear" - } - }, - "id": 4125569125075486, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Kubectl Execution", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.kubectl.exec.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "palette": "orange" - } - } - ], - "show_legend": true, - "title": "Count of Kubectl Executions", - "title_align": "left", - "title_size": "16", - "type": "timeseries", - "yaxis": { - "include_zero": true, - "max": "auto", - "min": "auto", - "scale": "linear" - } - }, - "id": 6916335121689932, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 6 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Pending Kubectl Execution", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.app_controller.kubectl.exec.pending{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "palette": "orange" - } - } - ], - "show_legend": true, - "title": "Count of Pending Kubectl Executions", - "title_align": "left", - "title_size": "16", - "type": "timeseries", - "yaxis": { - "include_zero": true, - "max": "auto", - "min": "auto", - "scale": "linear" - } - }, - "id": 1713544962494578, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 6 - } - } - ] - }, - "id": 8970831812548910, - "layout": { - "height": 10, - "width": 12, - "x": 0, - "y": 23 - } - }, - { - "definition": { - "background_color": "vivid_purple", - "layout_type": "ordered", - "show_title": true, - "title": "Server Stats", - "type": "group", - "widgets": [ - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "All Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{$host,$kube_cluster_name,$kube_namespace} by {grpc_service,kube_cluster_name,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Service Requests by Service", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 7853075716472980, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Cluster Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:cluster.clusterservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Cluster Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 2986577135722696, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Application Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:application.applicationservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Application Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 4161309530762940, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Repository Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:repository.repositoryservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Repository Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 3346295316212716, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Session Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:session.sessionservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Session Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 251735075640654, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 6 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Version Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:version.versionservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Version Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 6377937600157456, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 6 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Account Service Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:account.accountservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,kube_cluster_name,host}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Account Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 8207475356653118, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 9 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Settings Service Request ", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.grpc.server.handled.count{grpc_service:cluster.settingsservice,$host,$kube_cluster_name,$kube_namespace} by {grpc_code,grpc_method,host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "purple" - } - } - ], - "show_legend": true, - "title": "Count of Settings Service Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 5496058710860268, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 9 - } - }, - { - "definition": { - "background_color": "purple", - "content": "API Server Telemetry", - "font_size": "18", - "has_padding": true, - "show_tick": false, - "text_align": "center", - "tick_edge": "left", - "tick_pos": "50%", - "type": "note", - "vertical_align": "center" - }, - "id": 3658743930291138, - "layout": { - "height": 1, - "width": 12, - "x": 0, - "y": 12 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Memory Allocated", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.api_server.go.memstats.heap.alloc_bytes{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "API Server Memory Usage by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 5099362422931018, - "layout": { - "height": 3, - "width": 4, - "x": 0, - "y": 13 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Goroutines", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.api_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "API Server Goroutines Usage by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 5166753638637396, - "layout": { - "height": 3, - "width": 4, - "x": 4, - "y": 13 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "CPU Time", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.api_server.process.cpu.seconds.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "API Server CPU Time by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 6597509157761322, - "layout": { - "height": 3, - "width": 4, - "x": 8, - "y": 13 - } - } - ] - }, - "id": 2661663506447074, - "layout": { - "height": 17, - "width": 12, - "x": 0, - "y": 33 - } - }, - { - "definition": { - "background_color": "vivid_orange", - "layout_type": "ordered", - "show_title": true, - "title": "Repository Server Stats", - "type": "group", - "widgets": [ - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Ls-remote Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.repo_server.git.request.count{request_type:ls-remote,$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Count of Git Ls-Remote Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 8507386561737364, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.repo_server.git.request.duration.seconds.bucket{request_type:ls-remote,$host,$kube_cluster_name,$kube_namespace} by {upper_bound,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Git Ls-Remote Requests Performance", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 5597200409579852, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Fetch Request", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.repo_server.git.request.count{request_type:fetch,$host,$kube_cluster_name,$kube_namespace}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Count of Git Fetch Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1635931665551580, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.repo_server.git.request.duration.seconds.bucket{request_type:fetch,kube_cluster_name,$host,$kube_cluster_name,$kube_namespace}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Fetch Git Requests Performance", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1418427818359380, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Request", - "formula": "query2" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query2", - "query": "sum:argocd.api_server.redis.request.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Count of of Redis Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1888889021360466, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 6 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Number of Requests Failures", - "formula": "query2" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query2", - "query": "sum:argocd.api_server.redis.request.count{failed:true,$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Number of Failed Redis Requests", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1452795846002068, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 6 - } - }, - { - "definition": { - "background_color": "orange", - "content": "Repository Server Telemetry", - "font_size": "18", - "has_padding": true, - "show_tick": false, - "text_align": "center", - "tick_edge": "left", - "tick_pos": "50%", - "type": "note", - "vertical_align": "center" - }, - "id": 915681521277132, - "layout": { - "height": 1, - "width": 12, - "x": 0, - "y": 9 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Memory Allocated", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.repo_server.go.memstats.heap.alloc_bytes{$host,$kube_cluster_name,$kube_namespace} by {kube_cluster_name,host}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Repository Server Memory Usage by Cluster", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 4222714840704378, - "layout": { - "height": 3, - "width": 4, - "x": 0, - "y": 10 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Goroutines", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.repo_server.go.goroutines{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Repository Server Goroutines Usage", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1739824276453470, - "layout": { - "height": 3, - "width": 4, - "x": 4, - "y": 10 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "CPU Time", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "sum:argocd.repo_server.process.cpu.seconds.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}.as_count()" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "dog_classic" - } - } - ], - "show_legend": true, - "title": "Repository Server CPU Time", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 7302272394223286, - "layout": { - "height": 3, - "width": 4, - "x": 8, - "y": 10 - } - } - ] - }, - "id": 444244913319832, - "layout": { - "height": 14, - "width": 12, - "x": 0, - "y": 50 - } - }, - { - "definition": { - "background_color": "vivid_green", - "layout_type": "ordered", - "show_title": true, - "title": "Cluster Stats", - "type": "group", - "widgets": [ - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "API Resource Object", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.app_controller.cluster.api.resource_objects{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "green" - } - } - ], - "show_legend": true, - "title": "Count of Cluster Resource Objects", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 877335939374388, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "API Resource", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.app_controller.cluster_api_resources{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "green" - } - } - ], - "show_legend": true, - "title": "Count of API Resources", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 6895703789485698, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 0 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "bars", - "formulas": [ - { - "alias": "Cluster Event", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.app_controller.cluster.events.count{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "green" - } - } - ], - "show_legend": true, - "title": "Count of Cluster Events", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 8008111599023896, - "layout": { - "height": 3, - "width": 6, - "x": 0, - "y": 3 - } - }, - { - "definition": { - "legend_columns": [ - "avg", - "min", - "max", - "value", - "sum" - ], - "legend_layout": "auto", - "requests": [ - { - "display_type": "line", - "formulas": [ - { - "alias": "Cluster Cache Age", - "formula": "query1" - } - ], - "queries": [ - { - "data_source": "metrics", - "name": "query1", - "query": "avg:argocd.app_controller.cluster.cache.age.seconds{$host,$kube_cluster_name,$kube_namespace} by {host,kube_cluster_name}" - } - ], - "response_format": "timeseries", - "style": { - "line_type": "solid", - "line_width": "normal", - "palette": "green" - } - } - ], - "show_legend": true, - "title": "Age of Cluster Cache", - "title_align": "left", - "title_size": "16", - "type": "timeseries" - }, - "id": 1101747570951110, - "layout": { - "height": 3, - "width": 6, - "x": 6, - "y": 3 - } - } - ] - }, - "id": 5257189791506674, - "layout": { - "height": 7, - "is_column_break": true, - "width": 12, - "x": 0, - "y": 64 - } - }, - { - "definition": { - "background_color": "vivid_blue", - "layout_type": "ordered", - "show_title": true, - "title": "Logs", - "type": "group", - "widgets": [ - { - "definition": { - "requests": [ - { - "columns": [ - { - "field": "status_line", - "width": "auto" - }, - { - "field": "timestamp", - "width": "auto" - }, - { - "field": "host", - "width": "auto" - }, - { - "field": "service", - "width": "auto" - }, - { - "field": "content", - "width": "compact" - } - ], - "query": { - "data_source": "logs_stream", - "indexes": [], - "query_string": "source:argocd", - "sort": { - "column": "timestamp", - "order": "desc" - }, - "storage": "hot" - }, - "response_format": "event_list" - } - ], - "title": "", - "title_align": "left", - "title_size": "16", - "type": "list_stream" - }, - "id": 7799454257481500, - "layout": { - "height": 3, - "width": 12, - "x": 0, - "y": 0 - } - } - ] - }, - "id": 5039638453713644, - "layout": { - "height": 4, - "width": 12, - "x": 0, - "y": 71 - } - } - ] -} \ No newline at end of file diff --git a/argo_rollouts/assets/dashboards/overview.json b/argo_rollouts/assets/dashboards/overview.json new file mode 100644 index 0000000000000..10801d3eaf86f --- /dev/null +++ b/argo_rollouts/assets/dashboards/overview.json @@ -0,0 +1,41 @@ +{ + "author_name": "Datadog", + "description": "[[suggested_dashboards]]", + "layout_type": "ordered", + "template_variables": [], + "title": "Argo Rollouts Overview", + "widgets": [ + { + "definition": { + "banner_img": "public/static/images/logos/argo-rollouts_large.svg", + "layout_type": "ordered", + "show_title": false, + "title": "", + "type": "group", + "widgets": [] + }, + "id": 2826076057698652, + "layout": { + "height": 5, + "width": 6, + "x": 0, + "y": 0 + } + }, + { + "definition": { + "layout_type": "ordered", + "title": "New group", + "type": "group", + "widgets": [] + }, + "id": 6669807407706588, + "layout": { + "height": 5, + "width": 6, + "x": 6, + "y": 0 + } + } + ] +} \ No newline at end of file diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index d2146a4ea18b9..cfcd52e7e789d 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -43,7 +43,9 @@ "metadata_path": "assets/service_checks.json" } }, - "dashboards": {}, + "dashboards": { + "Argo Rollouts Overview": "assets/dashboards/overview.json" + }, "monitors": {}, "logs": {}, "saved_views": {} From 54924bfd03d84343fa0b9e28f948b8c3e42d3378 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 23:24:47 -0500 Subject: [PATCH 16/43] manifest metric to check --- argo_rollouts/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index cfcd52e7e789d..c5324bbf975f3 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -36,7 +36,7 @@ }, "metrics": { "prefix": "argo_rollouts.", - "check": "", + "check": "argo_rollouts.go.threads", "metadata_path": "metadata.csv" }, "service_checks": { From 840256ccdef8fecc95ec68a20f41ff513c10faba Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 23:26:56 -0500 Subject: [PATCH 17/43] manifest --- argo_rollouts/manifest.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index c5324bbf975f3..29dee94190121 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -45,10 +45,7 @@ }, "dashboards": { "Argo Rollouts Overview": "assets/dashboards/overview.json" - }, - "monitors": {}, - "logs": {}, - "saved_views": {} + } }, "author": { "support_email": "help@datadoghq.com", From 478520497b1fe375d43bdc31fd5275e82a2d2d8c Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 23:33:43 -0500 Subject: [PATCH 18/43] manifest --- argo_rollouts/manifest.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index 29dee94190121..07005d6e40eec 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -31,6 +31,9 @@ "configuration": { "spec": "assets/configuration/spec.yaml" }, + "process_signatures": [ + "rollouts-controller" + ], "events": { "creates_events": false }, @@ -45,6 +48,9 @@ }, "dashboards": { "Argo Rollouts Overview": "assets/dashboards/overview.json" + }, + "logs": { + "source": "envoy" } }, "author": { From 83dde5b3af734a4c4fd0e0a76dd637a6a48e764b Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 5 Mar 2024 23:51:13 -0500 Subject: [PATCH 19/43] labeler --- .github/workflows/config/labeler.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/config/labeler.yml b/.github/workflows/config/labeler.yml index 880f572456594..4b4a4022981cc 100644 --- a/.github/workflows/config/labeler.yml +++ b/.github/workflows/config/labeler.yml @@ -59,6 +59,8 @@ integration/apache: - apache/**/* integration/arangodb: - arangodb/**/* +integration/argo_rollouts: +- argo_rollouts/**/* integration/argocd: - argocd/**/* integration/aspdotnet: From 46dd6ee31ec0684abecdee7b110ada20a0c259cc Mon Sep 17 00:00:00 2001 From: steveny91 Date: Wed, 6 Mar 2024 16:57:35 -0500 Subject: [PATCH 20/43] metadata descriptions --- argo_rollouts/metadata.csv | 54 ++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index c4ad36789bce1..1932ad90dea29 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -47,28 +47,32 @@ argo_rollouts.process.start_time.seconds,gauge,,second,,The start time of the pr argo_rollouts.process.virtual_memory.bytes,gauge,,byte,,The virtual memory size in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory bytes, argo_rollouts.process.virtual_memory.max_bytes,gauge,,byte,,The maximum amount of virtual memory available in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory max_byte, argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, -argo_rollouts.analysis.run.info,gauge,,,,,,argo_rollouts,, -argo_rollouts.analysis.run.metric.phase,gauge,,,,,,argo_rollouts,, -argo_rollouts.analysis.run.metric.type,gauge,,,,,,argo_rollouts,, -argo_rollouts.analysis.run.phase,gauge,,,,,,argo_rollouts,, -argo_rollouts.analysis.run.reconcile,gauge,,,,,,argo_rollouts,, -argo_rollouts.analysis.run.reconcile.error,gauge,,,,,,argo_rollouts,, -argo_rollouts.conroller.info,gauge,,,,,,argo_rollouts,, -argo_rollouts.experiment.info,gauge,,,,,,argo_rollouts,, -argo_rollouts.experiment.phase,gauge,,,,,,argo_rollouts,, -argo_rollouts.experiment.reconcile,gauge,,,,,,argo_rollouts,, -argo_rollouts.experiment.reconcile.error,gauge,,,,,,argo_rollouts,, -argo_rollouts.notification.send.bucket,count,,,,,,argo_rollouts,, -argo_rollouts.notification.send.count,count,,,,,,argo_rollouts,, -argo_rollouts.notification.send.sum,count,,,,,,argo_rollouts,, -argo_rollouts.rollout.events.count,count,,,,,,argo_rollouts,, -argo_rollouts.rollout.info,gauge,,,,,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.available,gauge,,,,,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.desired,gauge,,,,,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.updated,gauge,,,,,,argo_rollouts,, -argo_rollouts.rollout.phase,gauge,,,,,,argo_rollouts,, -argo_rollouts.rollout.reconcile.bucket,count,,,,,,argo_rollouts,, -argo_rollouts.rollout.reconcile.count,count,,,,,,argo_rollouts,, -argo_rollouts.rollout.reconcile.sum,count,,,,,,argo_rollouts,, -argo_rollouts.rollout.reconcile.error.count,count,,,,,,argo_rollouts,, \ No newline at end of file +argo_rollouts.analysis.run.info,gauge,,,,Information about analysis run,,argo_rollouts,, +argo_rollouts.analysis.run.metric.phase,gauge,,,,Information on the duration of a specific metric in the Analysis Run,,argo_rollouts,, +argo_rollouts.analysis.run.metric.type,gauge,,,,Information on the type of a specific metric in the Analysis Runs,,argo_rollouts,, +argo_rollouts.analysis.run.phase,gauge,,,,Information on the state of the Analysis Run,,argo_rollouts,, +argo_rollouts.analysis.run.reconcile.bucket,count,,,,The number of observations in the Analysis Run reconciliation performance histogram by upper_bound buckets,,argo_rollouts,, +argo_rollouts.analysis.run.reconcile.count,count,,,,The number of observations in the Analysis Run reconciliation performance histogram,,argo_rollouts,, +argo_rollouts.analysis.run.reconcile.sum,count,,,,The duration sum of all observations in the Analysis Run reconciliation performance histogram,,argo_rollouts,, +argo_rollouts.analysis.run.reconcile.error.count,count,,,,Error occurring during the analysis run,,argo_rollouts,, +argo_rollouts.conroller.info,gauge,,,,Running Argo-rollouts version. The value of this metric will be `1` and will be tagged by `version`,,argo_rollouts,, +argo_rollouts.experiment.info,gauge,,,,Information about Experiment,,argo_rollouts,, +argo_rollouts.experiment.phase,gauge,,,,Information on the state of the experiment,,argo_rollouts,, +argo_rollouts.experiment.reconcile.bucket,count,,,,The number of observations in the Experiments reconciliation performance histogram by upper_bound buckets,,argo_rollouts,, +argo_rollouts.experiment.reconcile.count,count,,,,The number of observations in the Experiments reconciliation performance histogram,,argo_rollouts,, +argo_rollouts.experiment.reconcile.sum,count,,,,The duration sum of all observations in the Experiments reconciliation performance histogram,,argo_rollouts,, +argo_rollouts.experiment.reconcile.error.count,count,,,,Error occurring during the experiment,,argo_rollouts,, +argo_rollouts.notification.send.bucket,count,,,,The number of observations in the Notification send performance histogram by upper_bound buckets,,argo_rollouts,, +argo_rollouts.notification.send.count,count,,,,The number of observations in the Notification send performance histogram,,argo_rollouts,, +argo_rollouts.notification.send.sum,count,,,,The duration sum of all observations in the Notification send performance histogram,,argo_rollouts,, +argo_rollouts.rollout.events.count,count,,,,The count of rollout events,,argo_rollouts,, +argo_rollouts.rollout.info,gauge,,,,Information about rollout,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.available,gauge,,,,The number of available replicas per rollout,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.desired,gauge,,,,The number of desired replicas per rollout,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,The number of unavailable replicas per rollout,,argo_rollouts,, +argo_rollouts.rollout.info.replicas.updated,gauge,,,,The number of updated replicas per rollout,,argo_rollouts,, +argo_rollouts.rollout.phase,gauge,,,,"Information on the state of the rollout. This will be soon to be deprecated by Argo Rollouts, use `argo_rollouts.rollout.info` instead",,argo_rollouts,, +argo_rollouts.rollout.reconcile.bucket,count,,,,The number of observations in the Rollout reconciliation performance histogram by upper_bound buckets,,argo_rollouts,, +argo_rollouts.rollout.reconcile.count,count,,,,The number of observations in the Rollout reconciliation performance histogram,,argo_rollouts,, +argo_rollouts.rollout.reconcile.sum,count,,,,The duration sum of all observations in the Rollout reconciliation performance histogram,,argo_rollouts,, +argo_rollouts.rollout.reconcile.error.count,count,,,,Error occurring during the rollout,,argo_rollouts,, \ No newline at end of file From 776eca790a50ba448c5a5974497fe17bb77be938 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Thu, 7 Mar 2024 11:03:07 -0500 Subject: [PATCH 21/43] Update argo_rollouts/README.md Co-authored-by: cecilia saixue watt --- argo_rollouts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index cad0ee0f81058..633f892be5839 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -76,7 +76,7 @@ The Argo_Rollouts integration does not include any events. ### Service Checks -The Argo_Rollouts integration does not include any service checks. +The Argo Rollouts integration does not include any service checks. See [service_checks.json][8] for a list of service checks provided by this integration. From 69663bbd9227b2ceaf561aeb590ddc74128b8822 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Thu, 7 Mar 2024 11:03:13 -0500 Subject: [PATCH 22/43] Update argo_rollouts/README.md Co-authored-by: cecilia saixue watt --- argo_rollouts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index 633f892be5839..879d15123ec99 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -72,7 +72,7 @@ See [metadata.csv][7] for a list of metrics provided by this integration. ### Events -The Argo_Rollouts integration does not include any events. +The Argo Rollouts integration does not include any events. ### Service Checks From 7d0e61166ecaf29d406fb6089fdf9954362081a6 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Thu, 7 Mar 2024 11:03:18 -0500 Subject: [PATCH 23/43] Update argo_rollouts/README.md Co-authored-by: cecilia saixue watt --- argo_rollouts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index 879d15123ec99..85320f024040a 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -16,7 +16,7 @@ This check uses [OpenMetrics][5] to collect metrics from the OpenMetrics endpoin ### Configuration -The Argo Rollouts controller has Prometheus formatted metrics readily available at `/metrics` on port `8090`. For the Agent to start collecting metrics, the Argo Rollouts pods need to be annotated. For more information about annotations, refer to the [Autodiscovery Integration Templates][3] for guidance. You can find additional configuration options by reviewing the [sample argo_rollouts.d/conf.yaml][4]. +The Argo Rollouts controller has Prometheus-formatted metrics readily available at `/metrics` on port `8090`. For the Agent to start collecting metrics, the Argo Rollouts pods need to be annotated. For more information about annotations, refer to the [Autodiscovery Integration Templates][3] for guidance. You can find additional configuration options by reviewing the [sample argo_rollouts.d/conf.yaml][4]. **Note**: The listed metrics can only be collected if they are available. Some metrics are generated only when certain actions are performed. For example, the `argo_rollout.info.replicas.updated` metric is exposed only after a replica is updated. From ad30f83fb5e2eb9ffb40a1a5a0be087ecc72d3d2 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Thu, 7 Mar 2024 11:03:24 -0500 Subject: [PATCH 24/43] Update argo_rollouts/README.md Co-authored-by: cecilia saixue watt --- argo_rollouts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index 85320f024040a..2c9ea9edf4e5a 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -2,7 +2,7 @@ ## Overview -This check monitors [Argo_Rollouts][1] through the Datadog Agent. +This check monitors [Argo Rollouts][1] through the Datadog Agent. ## Setup From 05a4aafa78a330820fe3693e81f01163ecef0ab0 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Thu, 7 Mar 2024 11:03:28 -0500 Subject: [PATCH 25/43] Update argo_rollouts/README.md Co-authored-by: cecilia saixue watt --- argo_rollouts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index 2c9ea9edf4e5a..203ead983f899 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -1,4 +1,4 @@ -# Agent Check: Argo_Rollouts +# Agent Check: Argo Rollouts ## Overview From 55d25420a5a1823cffbc7f692661e95c5c680a24 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Fri, 8 Mar 2024 12:14:38 -0500 Subject: [PATCH 26/43] Update argo_rollouts/README.md Co-authored-by: Florent Clarret --- argo_rollouts/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/argo_rollouts/README.md b/argo_rollouts/README.md index 203ead983f899..4e7324a4212e1 100644 --- a/argo_rollouts/README.md +++ b/argo_rollouts/README.md @@ -76,8 +76,6 @@ The Argo Rollouts integration does not include any events. ### Service Checks -The Argo Rollouts integration does not include any service checks. - See [service_checks.json][8] for a list of service checks provided by this integration. ## Troubleshooting From f1e1aa41b539cc0cc8c91f62dc9286b6c00c9928 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Fri, 8 Mar 2024 12:14:44 -0500 Subject: [PATCH 27/43] Update argo_rollouts/datadog_checks/argo_rollouts/__about__.py Co-authored-by: Florent Clarret --- argo_rollouts/datadog_checks/argo_rollouts/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/__about__.py b/argo_rollouts/datadog_checks/argo_rollouts/__about__.py index acbfd1c866b84..e9541ce83e9e5 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/__about__.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/__about__.py @@ -1,4 +1,4 @@ # (C) Datadog, Inc. 2024-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -__version__ = '1.0.0' +__version__ = '0.0.1' From ed5df44e186b309b981f8e73ea8fc2612a1a6166 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Fri, 8 Mar 2024 12:15:10 -0500 Subject: [PATCH 28/43] Update argo_rollouts/manifest.json Co-authored-by: Florent Clarret --- argo_rollouts/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/manifest.json b/argo_rollouts/manifest.json index 07005d6e40eec..dfdb9d3a51178 100644 --- a/argo_rollouts/manifest.json +++ b/argo_rollouts/manifest.json @@ -50,7 +50,7 @@ "Argo Rollouts Overview": "assets/dashboards/overview.json" }, "logs": { - "source": "envoy" + "source": "argo_rollouts" } }, "author": { From 17258ba4504f792cb79df1fdd5da797416b31e0a Mon Sep 17 00:00:00 2001 From: steveny91 Date: Fri, 8 Mar 2024 12:18:48 -0500 Subject: [PATCH 29/43] fix remapped labels --- argo_rollouts/datadog_checks/argo_rollouts/metrics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index 3cfadd4b389f0..be58115f9bd09 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -69,6 +69,6 @@ } RENAME_LABELS_MAP = { - "name": "argo_rollout_name", - 'namespace': 'argo_rollout_namespace', + "name": "argo_rollouts_name", + 'namespace': 'argo_rollouts_namespace', } From 1aff0464b3f7ccad85f088f10ad7dd15809e15e6 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Fri, 8 Mar 2024 12:20:51 -0500 Subject: [PATCH 30/43] simplify check --- argo_rollouts/datadog_checks/argo_rollouts/check.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/check.py b/argo_rollouts/datadog_checks/argo_rollouts/check.py index 41a5b59498379..f8195df19e8fc 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/check.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/check.py @@ -10,14 +10,6 @@ class ArgoRolloutsCheck(OpenMetricsBaseCheckV2): DEFAULT_METRIC_LIMIT = 0 __NAMESPACE__ = 'argo_rollouts' - def __init__(self, name, init_config, instances=None): - - super(ArgoRolloutsCheck, self).__init__( - name, - init_config, - instances, - ) - def get_default_config(self): return { 'metrics': [METRIC_MAP], From 7b777fa7fe23171beb203863533bdc6d4f75069a Mon Sep 17 00:00:00 2001 From: steveny91 Date: Fri, 8 Mar 2024 12:39:50 -0500 Subject: [PATCH 31/43] add service_checks test --- argo_rollouts/tests/conftest.py | 5 ----- argo_rollouts/tests/test_e2e.py | 3 ++- argo_rollouts/tests/test_unit.py | 6 +++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/argo_rollouts/tests/conftest.py b/argo_rollouts/tests/conftest.py index 467f44683850b..2ddc79b1fa8ac 100644 --- a/argo_rollouts/tests/conftest.py +++ b/argo_rollouts/tests/conftest.py @@ -34,8 +34,3 @@ def dd_environment(): instances = [{'openmetrics_endpoint': f'http://{argo_rollouts_host}:{argo_rollouts_port}/metrics'}] yield {'instances': instances} - - -@pytest.fixture -def instance(): - return {} diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 7a49842fc0321..145190c4e6681 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -4,7 +4,7 @@ import pytest from datadog_checks.base.constants import ServiceCheck -from datadog_checks.dev.utils import get_metadata_metrics +from datadog_checks.dev.utils import assert_service_checks, get_metadata_metrics from .common import E2E_METRICS @@ -19,3 +19,4 @@ def test_e2e_openmetrics_v2(dd_agent_check): aggregator.assert_all_metrics_covered() aggregator.assert_metrics_using_metadata(get_metadata_metrics()) + assert_service_checks(aggregator) diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index 003cf56af7315..ccc686e9fc139 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -5,12 +5,10 @@ from datadog_checks.argo_rollouts import ArgoRolloutsCheck from datadog_checks.base.constants import ServiceCheck -from datadog_checks.dev.utils import get_metadata_metrics +from datadog_checks.dev.utils import assert_service_checks, get_metadata_metrics from .common import OM_METRICS, OM_MOCKED_INSTANCE, get_fixture_path -pytestmark = pytest.mark.unit - def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_http_response): mock_http_response(file_path=get_fixture_path('openmetrics.txt')) @@ -24,6 +22,7 @@ def test_check_mock_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_htt aggregator.assert_all_metrics_covered() aggregator.assert_metrics_using_metadata(get_metadata_metrics()) aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK) + assert_service_checks(aggregator) def test_check_mock_invalid_argo_rollouts_openmetrics(dd_run_check, aggregator, mock_http_response): @@ -33,3 +32,4 @@ def test_check_mock_invalid_argo_rollouts_openmetrics(dd_run_check, aggregator, dd_run_check(check) aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.CRITICAL) + assert_service_checks(aggregator) From dbb2ce2dc00e25802cfc33895c1f0f05f2b359f1 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Fri, 8 Mar 2024 14:59:34 -0500 Subject: [PATCH 32/43] add test for label rename --- argo_rollouts/tests/test_unit.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index ccc686e9fc139..f44cbaa1f13f4 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -33,3 +33,14 @@ def test_check_mock_invalid_argo_rollouts_openmetrics(dd_run_check, aggregator, aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.CRITICAL) assert_service_checks(aggregator) + + +def test_check_mock_labels_rename(dd_run_check, aggregator, mock_http_response): + mock_http_response(file_path=get_fixture_path('openmetrics.txt')) + check = ArgoRolloutsCheck('argo_rollouts', {}, [OM_MOCKED_INSTANCE]) + relabeled_tags = ['argo_rollouts_namespace:default', 'argo_rollouts_name:rollouts-demo'] + dd_run_check(check) + + aggregator.assert_metric('argo_rollouts.rollout.phase') + for tag in relabeled_tags: + aggregator.assert_metric_has_tag('argo_rollouts.rollout.phase', tag) From bf36e9a23bd062bf5917fc1ba54da151c3fdf8b9 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Wed, 13 Mar 2024 11:15:00 -0400 Subject: [PATCH 33/43] Update argo_rollouts/tests/test_e2e.py Co-authored-by: Florent Clarret --- argo_rollouts/tests/test_e2e.py | 1 - 1 file changed, 1 deletion(-) diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 145190c4e6681..210004faa4055 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -9,7 +9,6 @@ from .common import E2E_METRICS -@pytest.mark.e2e def test_e2e_openmetrics_v2(dd_agent_check): aggregator = dd_agent_check(rate=True) From ae8f5d190771089b70c865c10dc606249cf6e127 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Mon, 18 Mar 2024 10:18:01 -0400 Subject: [PATCH 34/43] simplify e2e --- argo_rollouts/tests/test_e2e.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 210004faa4055..47d8b7eafb242 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -4,18 +4,11 @@ import pytest from datadog_checks.base.constants import ServiceCheck -from datadog_checks.dev.utils import assert_service_checks, get_metadata_metrics - -from .common import E2E_METRICS +from datadog_checks.dev.utils import assert_service_checks def test_e2e_openmetrics_v2(dd_agent_check): - aggregator = dd_agent_check(rate=True) - - aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK, count=2) - for metric in E2E_METRICS: - aggregator.assert_metric(metric) + aggregator = dd_agent_check() - aggregator.assert_all_metrics_covered() - aggregator.assert_metrics_using_metadata(get_metadata_metrics()) + aggregator.assert_service_check('argo_rollouts.openmetrics.health', ServiceCheck.OK, count=1) assert_service_checks(aggregator) From 42ade2ea1eb8b1189a598cf2de25606da873fcac Mon Sep 17 00:00:00 2001 From: steveny91 Date: Mon, 18 Mar 2024 10:21:54 -0400 Subject: [PATCH 35/43] fix metadata --- argo_rollouts/metadata.csv | 58 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index 1932ad90dea29..3e3d7ebe2e86b 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -47,32 +47,32 @@ argo_rollouts.process.start_time.seconds,gauge,,second,,The start time of the pr argo_rollouts.process.virtual_memory.bytes,gauge,,byte,,The virtual memory size in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory bytes, argo_rollouts.process.virtual_memory.max_bytes,gauge,,byte,,The maximum amount of virtual memory available in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory max_byte, argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, -argo_rollouts.analysis.run.info,gauge,,,,Information about analysis run,,argo_rollouts,, -argo_rollouts.analysis.run.metric.phase,gauge,,,,Information on the duration of a specific metric in the Analysis Run,,argo_rollouts,, -argo_rollouts.analysis.run.metric.type,gauge,,,,Information on the type of a specific metric in the Analysis Runs,,argo_rollouts,, -argo_rollouts.analysis.run.phase,gauge,,,,Information on the state of the Analysis Run,,argo_rollouts,, -argo_rollouts.analysis.run.reconcile.bucket,count,,,,The number of observations in the Analysis Run reconciliation performance histogram by upper_bound buckets,,argo_rollouts,, -argo_rollouts.analysis.run.reconcile.count,count,,,,The number of observations in the Analysis Run reconciliation performance histogram,,argo_rollouts,, -argo_rollouts.analysis.run.reconcile.sum,count,,,,The duration sum of all observations in the Analysis Run reconciliation performance histogram,,argo_rollouts,, -argo_rollouts.analysis.run.reconcile.error.count,count,,,,Error occurring during the analysis run,,argo_rollouts,, -argo_rollouts.conroller.info,gauge,,,,Running Argo-rollouts version. The value of this metric will be `1` and will be tagged by `version`,,argo_rollouts,, -argo_rollouts.experiment.info,gauge,,,,Information about Experiment,,argo_rollouts,, -argo_rollouts.experiment.phase,gauge,,,,Information on the state of the experiment,,argo_rollouts,, -argo_rollouts.experiment.reconcile.bucket,count,,,,The number of observations in the Experiments reconciliation performance histogram by upper_bound buckets,,argo_rollouts,, -argo_rollouts.experiment.reconcile.count,count,,,,The number of observations in the Experiments reconciliation performance histogram,,argo_rollouts,, -argo_rollouts.experiment.reconcile.sum,count,,,,The duration sum of all observations in the Experiments reconciliation performance histogram,,argo_rollouts,, -argo_rollouts.experiment.reconcile.error.count,count,,,,Error occurring during the experiment,,argo_rollouts,, -argo_rollouts.notification.send.bucket,count,,,,The number of observations in the Notification send performance histogram by upper_bound buckets,,argo_rollouts,, -argo_rollouts.notification.send.count,count,,,,The number of observations in the Notification send performance histogram,,argo_rollouts,, -argo_rollouts.notification.send.sum,count,,,,The duration sum of all observations in the Notification send performance histogram,,argo_rollouts,, -argo_rollouts.rollout.events.count,count,,,,The count of rollout events,,argo_rollouts,, -argo_rollouts.rollout.info,gauge,,,,Information about rollout,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.available,gauge,,,,The number of available replicas per rollout,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.desired,gauge,,,,The number of desired replicas per rollout,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,The number of unavailable replicas per rollout,,argo_rollouts,, -argo_rollouts.rollout.info.replicas.updated,gauge,,,,The number of updated replicas per rollout,,argo_rollouts,, -argo_rollouts.rollout.phase,gauge,,,,"Information on the state of the rollout. This will be soon to be deprecated by Argo Rollouts, use `argo_rollouts.rollout.info` instead",,argo_rollouts,, -argo_rollouts.rollout.reconcile.bucket,count,,,,The number of observations in the Rollout reconciliation performance histogram by upper_bound buckets,,argo_rollouts,, -argo_rollouts.rollout.reconcile.count,count,,,,The number of observations in the Rollout reconciliation performance histogram,,argo_rollouts,, -argo_rollouts.rollout.reconcile.sum,count,,,,The duration sum of all observations in the Rollout reconciliation performance histogram,,argo_rollouts,, -argo_rollouts.rollout.reconcile.error.count,count,,,,Error occurring during the rollout,,argo_rollouts,, \ No newline at end of file +argo_rollouts.analysis.run.info,gauge,,,,Information about analysis run,0,argo_rollouts,argo_rollouts analysis run info, +argo_rollouts.analysis.run.metric.phase,gauge,,,,Information on the duration of a specific metric in the Analysis Run,0,argo_rollouts,argo_rollouts analysis run metric phase, +argo_rollouts.analysis.run.metric.type,gauge,,,,Information on the type of a specific metric in the Analysis Runs,0,argo_rollouts,argo_rollouts analysis run metric type, +argo_rollouts.analysis.run.phase,gauge,,,,Information on the state of the Analysis Run,0,argo_rollouts,argo_rollouts analysis run phase, +argo_rollouts.analysis.run.reconcile.bucket,count,,,,The number of observations in the Analysis Run reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts analysis run reconcile bucket, +argo_rollouts.analysis.run.reconcile.count,count,,,,The number of observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile count, +argo_rollouts.analysis.run.reconcile.sum,count,,,,The duration sum of all observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile sum, +argo_rollouts.analysis.run.reconcile.error.count,count,,,,Error occurring during the analysis run,0,argo_rollouts,argo_rollouts analysis run reconcile error count, +argo_rollouts.conroller.info,gauge,,,,Running Argo-rollouts version. The value of this metric will be `1` and will be tagged by `version`,0,argo_rollouts,argo_rollouts controller info, +argo_rollouts.experiment.info,gauge,,,,Information about Experiment,0,argo_rollouts,argo_rollouts experiment info, +argo_rollouts.experiment.phase,gauge,,,,Information on the state of the experiment,0,argo_rollouts,argo_rollouts experiment phase, +argo_rollouts.experiment.reconcile.bucket,count,,,,The number of observations in the Experiments reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts experiment reconcile bucket, +argo_rollouts.experiment.reconcile.count,count,,,,The number of observations in the Experiments reconciliation performance histogram,0,argo_rollouts,argo_rollouts experiment reconcile count, +argo_rollouts.experiment.reconcile.sum,count,,,,The duration sum of all observations in the Experiments reconciliation performance histogram,0,argo_rollouts,argo_rollouts experiment reconcile sum, +argo_rollouts.experiment.reconcile.error.count,count,,,,Error occurring during the experiment,0,argo_rollouts,argo_rollouts experiment reconcile error count, +argo_rollouts.notification.send.bucket,count,,,,The number of observations in the Notification send performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts notification send bucket, +argo_rollouts.notification.send.count,count,,,,The number of observations in the Notification send performance histogram,0,argo_rollouts,argo_rollouts notification send count, +argo_rollouts.notification.send.sum,count,,,,The duration sum of all observations in the Notification send performance histogram,0,argo_rollouts,argo_rollouts notification send sum, +argo_rollouts.rollout.events.count,count,,,,The count of rollout events,0,argo_rollouts,argo_rollouts rollout events count, +argo_rollouts.rollout.info,gauge,,,,Information about rollout,0,argo_rollouts,argo_rollouts rollout info, +argo_rollouts.rollout.info.replicas.available,gauge,,,,The number of available replicas per rollout,0,argo_rollouts,argo_rollouts rollout info replicas available, +argo_rollouts.rollout.info.replicas.desired,gauge,,,,The number of desired replicas per rollout,0,argo_rollouts,argo_rollouts rollout info replicas desired, +argo_rollouts.rollout.info.replicas.unavailable,gauge,,,,The number of unavailable replicas per rollout,0,argo_rollouts,argo_rollouts rollout info replicas unavailable, +argo_rollouts.rollout.info.replicas.updated,gauge,,,,The number of updated replicas per rollout,0,argo_rollouts,argo_rollouts rollout info replicas updated, +argo_rollouts.rollout.phase,gauge,,,,"Information on the state of the rollout. This will be soon to be deprecated by Argo Rollouts, use `argo_rollouts.rollout.info` instead",0,argo_rollouts,argo_rollouts rollout phase, +argo_rollouts.rollout.reconcile.bucket,count,,,,The number of observations in the Rollout reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts rollout reconcile bucket, +argo_rollouts.rollout.reconcile.count,count,,,,The number of observations in the Rollout reconciliation performance histogram,0,argo_rollouts,argo_rollouts rollout reconcile count, +argo_rollouts.rollout.reconcile.sum,count,,,,The duration sum of all observations in the Rollout reconciliation performance histogram,0,argo_rollouts,argo_rollouts rollout reconcile sum, +argo_rollouts.rollout.reconcile.error.count,count,,,,Error occurring during the rollout,0,argo_rollouts,argo_rollouts rollout reconcile error count, \ No newline at end of file From c6c089dd92520803a4e0be409ed1f03f2cc5622d Mon Sep 17 00:00:00 2001 From: steveny91 Date: Mon, 18 Mar 2024 13:41:45 -0400 Subject: [PATCH 36/43] lint --- argo_rollouts/tests/test_e2e.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/argo_rollouts/tests/test_e2e.py b/argo_rollouts/tests/test_e2e.py index 47d8b7eafb242..afac487aecbff 100644 --- a/argo_rollouts/tests/test_e2e.py +++ b/argo_rollouts/tests/test_e2e.py @@ -1,8 +1,6 @@ # (C) Datadog, Inc. 2024-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -import pytest - from datadog_checks.base.constants import ServiceCheck from datadog_checks.dev.utils import assert_service_checks From 59a921f428ee20c1dd921494301703b58c1bd635 Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Tue, 19 Mar 2024 10:02:06 -0400 Subject: [PATCH 37/43] Update argo_rollouts/assets/configuration/spec.yaml Co-authored-by: Florent Clarret --- argo_rollouts/assets/configuration/spec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/argo_rollouts/assets/configuration/spec.yaml b/argo_rollouts/assets/configuration/spec.yaml index 9dd66704f2966..42d16c91f1370 100644 --- a/argo_rollouts/assets/configuration/spec.yaml +++ b/argo_rollouts/assets/configuration/spec.yaml @@ -9,7 +9,6 @@ files: options: - template: instances/openmetrics overrides: - openmetrics_endpoint.required: true openmetrics_endpoint.value.example: http://localhost:8090/metrics openmetrics_endpoint.description: | Endpoint exposing the Argo Rollouts Controller's Prometheus metrics. For more information refer to: From 8a73ac41a00060e8ce38211ddbd74442b45011fb Mon Sep 17 00:00:00 2001 From: Steven Yuen Date: Tue, 19 Mar 2024 10:11:36 -0400 Subject: [PATCH 38/43] Update check.py --- argo_rollouts/datadog_checks/argo_rollouts/check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/check.py b/argo_rollouts/datadog_checks/argo_rollouts/check.py index f8195df19e8fc..9f26b14c2e536 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/check.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/check.py @@ -6,7 +6,7 @@ from .metrics import METRIC_MAP, RENAME_LABELS_MAP -class ArgoRolloutsCheck(OpenMetricsBaseCheckV2): +class ArgoRolloutsCheck(OpenMetricsBaseCheckV2, ConfigMixin): DEFAULT_METRIC_LIMIT = 0 __NAMESPACE__ = 'argo_rollouts' From 6ec826607da1b8ba1fa4c7f70c4e7cb7df67d135 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 19 Mar 2024 11:25:30 -0400 Subject: [PATCH 39/43] sort metrics --- argo_rollouts/metadata.csv | 62 +++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index 3e3d7ebe2e86b..eb43e27db02c9 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -1,4 +1,20 @@ metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric +argo_rollouts.analysis.run.info,gauge,,,,Information about analysis run,0,argo_rollouts,argo_rollouts analysis run info, +argo_rollouts.analysis.run.metric.phase,gauge,,,,Information on the duration of a specific metric in the Analysis Run,0,argo_rollouts,argo_rollouts analysis run metric phase, +argo_rollouts.analysis.run.metric.type,gauge,,,,Information on the type of a specific metric in the Analysis Runs,0,argo_rollouts,argo_rollouts analysis run metric type, +argo_rollouts.analysis.run.phase,gauge,,,,Information on the state of the Analysis Run,0,argo_rollouts,argo_rollouts analysis run phase, +argo_rollouts.analysis.run.reconcile.bucket,count,,,,The number of observations in the Analysis Run reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts analysis run reconcile bucket, +argo_rollouts.analysis.run.reconcile.count,count,,,,The number of observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile count, +argo_rollouts.analysis.run.reconcile.error.count,count,,,,Error occurring during the analysis run,0,argo_rollouts,argo_rollouts analysis run reconcile error count, +argo_rollouts.analysis.run.reconcile.sum,count,,,,The duration sum of all observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile sum, +argo_rollouts.conroller.info,gauge,,,,Running Argo-rollouts version. The value of this metric will be `1` and will be tagged by `version`,0,argo_rollouts,argo_rollouts controller info, +argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, +argo_rollouts.experiment.info,gauge,,,,Information about Experiment,0,argo_rollouts,argo_rollouts experiment info, +argo_rollouts.experiment.phase,gauge,,,,Information on the state of the experiment,0,argo_rollouts,argo_rollouts experiment phase, +argo_rollouts.experiment.reconcile.bucket,count,,,,The number of observations in the Experiments reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts experiment reconcile bucket, +argo_rollouts.experiment.reconcile.count,count,,,,The number of observations in the Experiments reconciliation performance histogram,0,argo_rollouts,argo_rollouts experiment reconcile count, +argo_rollouts.experiment.reconcile.error.count,count,,,,Error occurring during the experiment,0,argo_rollouts,argo_rollouts experiment reconcile error count, +argo_rollouts.experiment.reconcile.sum,count,,,,The duration sum of all observations in the Experiments reconciliation performance histogram,0,argo_rollouts,argo_rollouts experiment reconcile sum, argo_rollouts.go.gc.duration.seconds.count,count,,second,,The summary count of garbage collection cycles in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go gc duration seconds count, argo_rollouts.go.gc.duration.seconds.quantile,gauge,,second,,A summary of the pause duration of garbage collection cycles in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go gc duration seconds, argo_rollouts.go.gc.duration.seconds.sum,count,,second,,The sum of the pause duration of garbage collection cycles in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go gc duration seconds sum, @@ -28,17 +44,9 @@ argo_rollouts.go.memstats.stack.inuse_bytes,gauge,,byte,,The number of bytes in argo_rollouts.go.memstats.stack.sys_bytes,gauge,,byte,,The number of bytes obtained from system for stack allocator in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats stack sys_bytes, argo_rollouts.go.memstats.sys_bytes,gauge,,byte,,The number of bytes obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats sys_bytes, argo_rollouts.go.threads,gauge,,thread,,The number of OS threads created in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go threads, -argo_rollouts.workqueue.adds.count,count,,,,The total number of adds handled by workqueue,0,argo_rollouts,argo_rollouts workqueue adds, -argo_rollouts.workqueue.depth,gauge,,,,The current depth of the workqueue,0,argo_rollouts,argo_rollouts workqueue depth, -argo_rollouts.workqueue.longest.running_processor.seconds,gauge,,second,,The number of seconds the longest running worqueue processor has been running,0,argo_rollouts,argo_rollouts workqueue longest running_processor seconds, -argo_rollouts.workqueue.queue.duration.seconds.bucket,count,,second,,The histogram bucket of how long in seconds an item stays in the workqueue before being requested,0,argo_rollouts,argo_rollouts workqueue queue duration seconds bucket, -argo_rollouts.workqueue.queue.duration.seconds.count,count,,,,The total number of events in the workqueue duration histogram,0,argo_rollouts,argo_rollouts workqueue queue duration seconds count, -argo_rollouts.workqueue.queue.duration.seconds.sum,count,,,,The sum the of events counted in the workqueue duration histogram,0,argo_rollouts,argo_rollouts workqueue queue duration seconds sum, -argo_rollouts.workqueue.retries.count,count,,,,The total number of retries handled by workqueue,0,argo_rollouts,argo_rollouts workqueue retries, -argo_rollouts.workqueue.unfinished_work.seconds,gauge,,second,,The number of seconds of work that has been done that is in progress and hasn't been observed by `work_duration`. Large values indicate stuck threads. One can deduce the number of stuck threads by observing the rate at which this increases,0,argo_rollouts,argo_rollouts workqueue unfinished_work seconds, -argo_rollouts.workqueue.work.duration.seconds.bucket,count,,second,,The histogram bucket for time in seconds it takes for processing of an item in the workqueue,0,argo_rollouts,argo_rollouts workqueue work duration seconds bucket, -argo_rollouts.workqueue.work.duration.seconds.count,count,,,,The total number of events in the workqueue item processing duration histogram,0,argo_rollouts,argo_rollouts workqueue work duration seconds count, -argo_rollouts.workqueue.work.duration.seconds.sum,count,,,,The sum of events in the workqueue item processing duration histogram,0,argo_rollouts,argo_rollouts workqueue work duration seconds sum, +argo_rollouts.notification.send.bucket,count,,,,The number of observations in the Notification send performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts notification send bucket, +argo_rollouts.notification.send.count,count,,,,The number of observations in the Notification send performance histogram,0,argo_rollouts,argo_rollouts notification send count, +argo_rollouts.notification.send.sum,count,,,,The duration sum of all observations in the Notification send performance histogram,0,argo_rollouts,argo_rollouts notification send sum, argo_rollouts.process.cpu.seconds.count,count,,second,,The total user and system CPU time spent in seconds in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process cpu seconds, argo_rollouts.process.max_fds,gauge,,,,The maximum number of open file descriptors in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process max_fds, argo_rollouts.process.open_fds,gauge,,,,The number of open file descriptors in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process open_fds, @@ -46,25 +54,6 @@ argo_rollouts.process.resident_memory.bytes,gauge,,byte,,The resident memory siz argo_rollouts.process.start_time.seconds,gauge,,second,,The start time of the process since unix epoch in seconds in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process start_time seconds, argo_rollouts.process.virtual_memory.bytes,gauge,,byte,,The virtual memory size in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory bytes, argo_rollouts.process.virtual_memory.max_bytes,gauge,,byte,,The maximum amount of virtual memory available in bytes in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts process virtual_memory max_byte, -argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, -argo_rollouts.analysis.run.info,gauge,,,,Information about analysis run,0,argo_rollouts,argo_rollouts analysis run info, -argo_rollouts.analysis.run.metric.phase,gauge,,,,Information on the duration of a specific metric in the Analysis Run,0,argo_rollouts,argo_rollouts analysis run metric phase, -argo_rollouts.analysis.run.metric.type,gauge,,,,Information on the type of a specific metric in the Analysis Runs,0,argo_rollouts,argo_rollouts analysis run metric type, -argo_rollouts.analysis.run.phase,gauge,,,,Information on the state of the Analysis Run,0,argo_rollouts,argo_rollouts analysis run phase, -argo_rollouts.analysis.run.reconcile.bucket,count,,,,The number of observations in the Analysis Run reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts analysis run reconcile bucket, -argo_rollouts.analysis.run.reconcile.count,count,,,,The number of observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile count, -argo_rollouts.analysis.run.reconcile.sum,count,,,,The duration sum of all observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile sum, -argo_rollouts.analysis.run.reconcile.error.count,count,,,,Error occurring during the analysis run,0,argo_rollouts,argo_rollouts analysis run reconcile error count, -argo_rollouts.conroller.info,gauge,,,,Running Argo-rollouts version. The value of this metric will be `1` and will be tagged by `version`,0,argo_rollouts,argo_rollouts controller info, -argo_rollouts.experiment.info,gauge,,,,Information about Experiment,0,argo_rollouts,argo_rollouts experiment info, -argo_rollouts.experiment.phase,gauge,,,,Information on the state of the experiment,0,argo_rollouts,argo_rollouts experiment phase, -argo_rollouts.experiment.reconcile.bucket,count,,,,The number of observations in the Experiments reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts experiment reconcile bucket, -argo_rollouts.experiment.reconcile.count,count,,,,The number of observations in the Experiments reconciliation performance histogram,0,argo_rollouts,argo_rollouts experiment reconcile count, -argo_rollouts.experiment.reconcile.sum,count,,,,The duration sum of all observations in the Experiments reconciliation performance histogram,0,argo_rollouts,argo_rollouts experiment reconcile sum, -argo_rollouts.experiment.reconcile.error.count,count,,,,Error occurring during the experiment,0,argo_rollouts,argo_rollouts experiment reconcile error count, -argo_rollouts.notification.send.bucket,count,,,,The number of observations in the Notification send performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts notification send bucket, -argo_rollouts.notification.send.count,count,,,,The number of observations in the Notification send performance histogram,0,argo_rollouts,argo_rollouts notification send count, -argo_rollouts.notification.send.sum,count,,,,The duration sum of all observations in the Notification send performance histogram,0,argo_rollouts,argo_rollouts notification send sum, argo_rollouts.rollout.events.count,count,,,,The count of rollout events,0,argo_rollouts,argo_rollouts rollout events count, argo_rollouts.rollout.info,gauge,,,,Information about rollout,0,argo_rollouts,argo_rollouts rollout info, argo_rollouts.rollout.info.replicas.available,gauge,,,,The number of available replicas per rollout,0,argo_rollouts,argo_rollouts rollout info replicas available, @@ -74,5 +63,16 @@ argo_rollouts.rollout.info.replicas.updated,gauge,,,,The number of updated repli argo_rollouts.rollout.phase,gauge,,,,"Information on the state of the rollout. This will be soon to be deprecated by Argo Rollouts, use `argo_rollouts.rollout.info` instead",0,argo_rollouts,argo_rollouts rollout phase, argo_rollouts.rollout.reconcile.bucket,count,,,,The number of observations in the Rollout reconciliation performance histogram by upper_bound buckets,0,argo_rollouts,argo_rollouts rollout reconcile bucket, argo_rollouts.rollout.reconcile.count,count,,,,The number of observations in the Rollout reconciliation performance histogram,0,argo_rollouts,argo_rollouts rollout reconcile count, +argo_rollouts.rollout.reconcile.error.count,count,,,,Error occurring during the rollout,0,argo_rollouts,argo_rollouts rollout reconcile error count, argo_rollouts.rollout.reconcile.sum,count,,,,The duration sum of all observations in the Rollout reconciliation performance histogram,0,argo_rollouts,argo_rollouts rollout reconcile sum, -argo_rollouts.rollout.reconcile.error.count,count,,,,Error occurring during the rollout,0,argo_rollouts,argo_rollouts rollout reconcile error count, \ No newline at end of file +argo_rollouts.workqueue.adds.count,count,,,,The total number of adds handled by workqueue,0,argo_rollouts,argo_rollouts workqueue adds, +argo_rollouts.workqueue.depth,gauge,,,,The current depth of the workqueue,0,argo_rollouts,argo_rollouts workqueue depth, +argo_rollouts.workqueue.longest.running_processor.seconds,gauge,,second,,The number of seconds the longest running worqueue processor has been running,0,argo_rollouts,argo_rollouts workqueue longest running_processor seconds, +argo_rollouts.workqueue.queue.duration.seconds.bucket,count,,second,,The histogram bucket of how long in seconds an item stays in the workqueue before being requested,0,argo_rollouts,argo_rollouts workqueue queue duration seconds bucket, +argo_rollouts.workqueue.queue.duration.seconds.count,count,,,,The total number of events in the workqueue duration histogram,0,argo_rollouts,argo_rollouts workqueue queue duration seconds count, +argo_rollouts.workqueue.queue.duration.seconds.sum,count,,,,The sum the of events counted in the workqueue duration histogram,0,argo_rollouts,argo_rollouts workqueue queue duration seconds sum, +argo_rollouts.workqueue.retries.count,count,,,,The total number of retries handled by workqueue,0,argo_rollouts,argo_rollouts workqueue retries, +argo_rollouts.workqueue.unfinished_work.seconds,gauge,,second,,The number of seconds of work that has been done that is in progress and hasn't been observed by `work_duration`. Large values indicate stuck threads. One can deduce the number of stuck threads by observing the rate at which this increases,0,argo_rollouts,argo_rollouts workqueue unfinished_work seconds, +argo_rollouts.workqueue.work.duration.seconds.bucket,count,,second,,The histogram bucket for time in seconds it takes for processing of an item in the workqueue,0,argo_rollouts,argo_rollouts workqueue work duration seconds bucket, +argo_rollouts.workqueue.work.duration.seconds.count,count,,,,The total number of events in the workqueue item processing duration histogram,0,argo_rollouts,argo_rollouts workqueue work duration seconds count, +argo_rollouts.workqueue.work.duration.seconds.sum,count,,,,The sum of events in the workqueue item processing duration histogram,0,argo_rollouts,argo_rollouts workqueue work duration seconds sum, From 52e8c91c234884b4fe796daedfe82cc9a7bc567b Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 19 Mar 2024 11:30:19 -0400 Subject: [PATCH 40/43] fix mistakenly named metric --- argo_rollouts/datadog_checks/argo_rollouts/check.py | 1 + argo_rollouts/datadog_checks/argo_rollouts/metrics.py | 2 +- argo_rollouts/tests/common.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/argo_rollouts/datadog_checks/argo_rollouts/check.py b/argo_rollouts/datadog_checks/argo_rollouts/check.py index 9f26b14c2e536..823b77ae03e5a 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/check.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/check.py @@ -3,6 +3,7 @@ # Licensed under a 3-clause BSD style license (see LICENSE) from datadog_checks.base import OpenMetricsBaseCheckV2 # noqa: F401 +from .config_models import ConfigMixin from .metrics import METRIC_MAP, RENAME_LABELS_MAP diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index be58115f9bd09..b1bb2df46d7ba 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -22,7 +22,7 @@ 'go_memstats_mallocs': 'go.memstats.mallocs', 'go_memstats_mcache_inuse_bytes': 'go.memstats.mcache.inuse_bytes', 'go_memstats_mcache_sys_bytes': 'go.memstats.mcache.sys_bytes', - 'go_memstats_mspan_inuse_bytes': 'go.memstats.mspan.inuse_use', + 'go_memstats_mspan_inuse_bytes': 'go.memstats.mspan.inuse_bytes', 'go_memstats_mspan_sys_bytes': 'go.memstats.mspan.sys_bytes', 'go_memstats_next_gc_bytes': 'go.memstats.next.gc_bytes', 'go_memstats_other_sys_bytes': 'go.memstats.other.sys_bytes', diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index 4509c1c73ba50..d92f529c40889 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -35,7 +35,7 @@ 'argo_rollouts.go.memstats.mallocs.count', 'argo_rollouts.go.memstats.mcache.inuse_bytes', 'argo_rollouts.go.memstats.mcache.sys_bytes', - 'argo_rollouts.go.memstats.mspan.inuse_use', + 'argo_rollouts.go.memstats.mspan.inuse_bytes', 'argo_rollouts.go.memstats.mspan.sys_bytes', 'argo_rollouts.go.memstats.next.gc_bytes', 'argo_rollouts.go.memstats.other.sys_bytes', From dccc97f04310c80b177fde169daf598bae92c8d5 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 19 Mar 2024 11:36:48 -0400 Subject: [PATCH 41/43] fix mistakenly named metric --- argo_rollouts/metadata.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index eb43e27db02c9..4e58465dcc8cf 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -36,7 +36,7 @@ argo_rollouts.go.memstats.lookups.count,count,,,,The number of pointer lookups,0 argo_rollouts.go.memstats.mallocs.count,count,,,,The number of mallocs,0,argo_rollouts,argo_rollouts go memstats mallocs, argo_rollouts.go.memstats.mcache.inuse_bytes,gauge,,byte,,The number of bytes in use by mcache structures in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mcache inuse_bytes, argo_rollouts.go.memstats.mcache.sys_bytes,gauge,,byte,,The number of bytes used for mcache structures obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mcache sys_bytes, -argo_rollouts.go.memstats.mspan.inuse_use,gauge,,byte,,The number of bytes in use by mspan structures in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mspan inuse_use, +argo_rollouts.go.memstats.mspan.inuse_bytes,gauge,,byte,,The number of bytes in use by mspan structures in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mspan inuse_use, argo_rollouts.go.memstats.mspan.sys_bytes,gauge,,byte,,The number of bytes used for mspan structures obtained from system in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats mspan sys_bytes, argo_rollouts.go.memstats.next.gc_bytes,gauge,,byte,,The number of heap bytes when next garbage collection takes place in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats next gc_bytes, argo_rollouts.go.memstats.other.sys_bytes,gauge,,byte,,The number of bytes used for other system allocations in the Argo Rollouts instance,0,argo_rollouts,argo_rollouts go memstats other sys_bytes, From 84ffdc413d25c2bd025e6d4432097bcb611c48c7 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 19 Mar 2024 11:37:56 -0400 Subject: [PATCH 42/43] cleanup --- argo_rollouts/tests/common.py | 51 ----------------------------------- 1 file changed, 51 deletions(-) diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index d92f529c40889..f919a83d98956 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -77,57 +77,6 @@ 'argo_rollouts.workqueue.work.duration.seconds.sum', ] -E2E_METRICS = [ - 'argo_rollouts.conroller.info', - 'argo_rollouts.controller.clientset.k8s.request.count', - 'argo_rollouts.go.gc.duration.seconds.count', - 'argo_rollouts.go.gc.duration.seconds.quantile', - 'argo_rollouts.go.gc.duration.seconds.sum', - 'argo_rollouts.go.goroutines', - 'argo_rollouts.go.info', - 'argo_rollouts.go.memstats.alloc_bytes', - 'argo_rollouts.go.memstats.alloc_bytes.count', - 'argo_rollouts.go.memstats.buck_hash.sys_bytes', - 'argo_rollouts.go.memstats.frees.count', - 'argo_rollouts.go.memstats.gc.sys_bytes', - 'argo_rollouts.go.memstats.heap.alloc_bytes', - 'argo_rollouts.go.memstats.heap.idle_bytes', - 'argo_rollouts.go.memstats.heap.inuse_bytes', - 'argo_rollouts.go.memstats.heap.objects', - 'argo_rollouts.go.memstats.heap.released_bytes', - 'argo_rollouts.go.memstats.heap.sys_bytes', - 'argo_rollouts.go.memstats.lookups.count', - 'argo_rollouts.go.memstats.mallocs.count', - 'argo_rollouts.go.memstats.mcache.inuse_bytes', - 'argo_rollouts.go.memstats.mcache.sys_bytes', - 'argo_rollouts.go.memstats.mspan.inuse_use', - 'argo_rollouts.go.memstats.mspan.sys_bytes', - 'argo_rollouts.go.memstats.next.gc_bytes', - 'argo_rollouts.go.memstats.other.sys_bytes', - 'argo_rollouts.go.memstats.stack.inuse_bytes', - 'argo_rollouts.go.memstats.stack.sys_bytes', - 'argo_rollouts.go.memstats.sys_bytes', - 'argo_rollouts.go.threads', - 'argo_rollouts.process.cpu.seconds.count', - 'argo_rollouts.process.max_fds', - 'argo_rollouts.process.open_fds', - 'argo_rollouts.process.resident_memory.bytes', - 'argo_rollouts.process.start_time.seconds', - 'argo_rollouts.process.virtual_memory.bytes', - 'argo_rollouts.process.virtual_memory.max_bytes', - 'argo_rollouts.workqueue.adds.count', - 'argo_rollouts.workqueue.depth', - 'argo_rollouts.workqueue.longest.running_processor.seconds', - 'argo_rollouts.workqueue.queue.duration.seconds.bucket', - 'argo_rollouts.workqueue.queue.duration.seconds.count', - 'argo_rollouts.workqueue.queue.duration.seconds.sum', - 'argo_rollouts.workqueue.retries.count', - 'argo_rollouts.workqueue.unfinished_work.seconds', - 'argo_rollouts.workqueue.work.duration.seconds.bucket', - 'argo_rollouts.workqueue.work.duration.seconds.count', - 'argo_rollouts.workqueue.work.duration.seconds.sum', -] - def get_fixture_path(filename): return os.path.join(HERE, 'fixtures', filename) From df5d074810266bf8b2a384f1668cf37be0fa2864 Mon Sep 17 00:00:00 2001 From: steveny91 Date: Tue, 19 Mar 2024 13:51:08 -0400 Subject: [PATCH 43/43] add controller version as metadata --- .../datadog_checks/argo_rollouts/metrics.py | 8 +++-- argo_rollouts/metadata.csv | 1 - argo_rollouts/tests/common.py | 2 +- argo_rollouts/tests/fixtures/label_rename.txt | 3 ++ argo_rollouts/tests/test_unit.py | 30 ++++++++++++++++--- 5 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 argo_rollouts/tests/fixtures/label_rename.txt diff --git a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py index b1bb2df46d7ba..7520bbc21327b 100644 --- a/argo_rollouts/datadog_checks/argo_rollouts/metrics.py +++ b/argo_rollouts/datadog_checks/argo_rollouts/metrics.py @@ -51,7 +51,6 @@ 'analysis_run_phase': 'analysis.run.phase', 'analysis_run_reconcile': 'analysis.run.reconcile', 'analysis_run_reconcile_error': 'analysis.run.reconcile.error', - 'argo_rollouts_controller_info': 'conroller.info', 'experiment_info': 'experiment.info', 'experiment_phase': 'experiment.phase', 'experiment_reconcile': 'experiment.reconcile', @@ -68,7 +67,12 @@ 'rollout_reconcile_error': 'rollout.reconcile.error', } +ARGO_ROLLOUT_VERSION = {'argo_rollouts_controller_info': {'type': 'metadata', 'label': 'version', 'name': 'version'}} + +METRIC_MAP.update(ARGO_ROLLOUT_VERSION) + RENAME_LABELS_MAP = { - "name": "argo_rollouts_name", + 'name': 'argo_rollouts_name', 'namespace': 'argo_rollouts_namespace', + 'version': 'go_version', } diff --git a/argo_rollouts/metadata.csv b/argo_rollouts/metadata.csv index 4e58465dcc8cf..dcb221181e8c9 100644 --- a/argo_rollouts/metadata.csv +++ b/argo_rollouts/metadata.csv @@ -7,7 +7,6 @@ argo_rollouts.analysis.run.reconcile.bucket,count,,,,The number of observations argo_rollouts.analysis.run.reconcile.count,count,,,,The number of observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile count, argo_rollouts.analysis.run.reconcile.error.count,count,,,,Error occurring during the analysis run,0,argo_rollouts,argo_rollouts analysis run reconcile error count, argo_rollouts.analysis.run.reconcile.sum,count,,,,The duration sum of all observations in the Analysis Run reconciliation performance histogram,0,argo_rollouts,argo_rollouts analysis run reconcile sum, -argo_rollouts.conroller.info,gauge,,,,Running Argo-rollouts version. The value of this metric will be `1` and will be tagged by `version`,0,argo_rollouts,argo_rollouts controller info, argo_rollouts.controller.clientset.k8s.request.count,count,,,,The total number of Kubernetes requests executed during application reconciliation,0,argo_rollouts,argo_rollouts controller clientset k8s request, argo_rollouts.experiment.info,gauge,,,,Information about Experiment,0,argo_rollouts,argo_rollouts experiment info, argo_rollouts.experiment.phase,gauge,,,,Information on the state of the experiment,0,argo_rollouts,argo_rollouts experiment phase, diff --git a/argo_rollouts/tests/common.py b/argo_rollouts/tests/common.py index f919a83d98956..c49fb8c7de48e 100644 --- a/argo_rollouts/tests/common.py +++ b/argo_rollouts/tests/common.py @@ -13,7 +13,7 @@ } OM_METRICS = [ - 'argo_rollouts.conroller.info', + # 'argo_rollouts.conroller.info', 'argo_rollouts.controller.clientset.k8s.request.count', 'argo_rollouts.go.gc.duration.seconds.count', 'argo_rollouts.go.gc.duration.seconds.quantile', diff --git a/argo_rollouts/tests/fixtures/label_rename.txt b/argo_rollouts/tests/fixtures/label_rename.txt new file mode 100644 index 0000000000000..fe004cd86ad2e --- /dev/null +++ b/argo_rollouts/tests/fixtures/label_rename.txt @@ -0,0 +1,3 @@ +# HELP rollout_info This was manually modified to use for testing renaming of the name, namespace and version labels. +# TYPE rollout_info gauge +rollout_info{name="rollouts-demo",namespace="default", version="go1.20.12"} 1 \ No newline at end of file diff --git a/argo_rollouts/tests/test_unit.py b/argo_rollouts/tests/test_unit.py index f44cbaa1f13f4..988cee2a93520 100644 --- a/argo_rollouts/tests/test_unit.py +++ b/argo_rollouts/tests/test_unit.py @@ -36,11 +36,33 @@ def test_check_mock_invalid_argo_rollouts_openmetrics(dd_run_check, aggregator, def test_check_mock_labels_rename(dd_run_check, aggregator, mock_http_response): - mock_http_response(file_path=get_fixture_path('openmetrics.txt')) + mock_http_response(file_path=get_fixture_path('label_rename.txt')) check = ArgoRolloutsCheck('argo_rollouts', {}, [OM_MOCKED_INSTANCE]) - relabeled_tags = ['argo_rollouts_namespace:default', 'argo_rollouts_name:rollouts-demo'] + relabeled_tags = ['argo_rollouts_namespace:default', 'argo_rollouts_name:rollouts-demo', 'go_version:go1.20.12'] dd_run_check(check) - aggregator.assert_metric('argo_rollouts.rollout.phase') + aggregator.assert_metric('argo_rollouts.rollout.info') for tag in relabeled_tags: - aggregator.assert_metric_has_tag('argo_rollouts.rollout.phase', tag) + aggregator.assert_metric_has_tag('argo_rollouts.rollout.info', tag) + + +def test_version_metadata(datadog_agent, dd_run_check, mock_http_response): + """ + Test metadata version collection with V2 implementation + """ + mock_http_response(file_path=get_fixture_path('openmetrics.txt')) + check = ArgoRolloutsCheck('argo_rollouts', {}, [OM_MOCKED_INSTANCE]) + check.check_id = 'test:123' + dd_run_check(check) + + # Version from fixture + version_metadata = { + 'version.scheme': 'semver', + 'version.major': '1', + 'version.minor': '6', + 'version.patch': '4', + 'version.build': 'a312af9', + 'version.raw': 'v1.6.4+a312af9', + } + + datadog_agent.assert_metadata('test:123', version_metadata)