Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(resilience4j): add new integration #2581

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions resilience4j/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# CHANGELOG - Resilience4j

## 1.0.0 / YYYY-MM-DD

***Added***:

* Initial Release

63 changes: 63 additions & 0 deletions resilience4j/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Agent Check: Resilience4j

## Overview

[Resilience4j](https://github.com/resilience4j/resilience4j) is a lightweight fault tolerance library inspired by Netflix Hystrix, but designed for functional programming. This check monitors [Resilience4j][1] through the Datadog Agent.

## Setup

### Installation

To install the Resilience4j check on your host:


1. Install the [developer toolkit]
(https://docs.datadoghq.com/developers/integrations/python/)
on any machine.

2. Run `ddev release build resilience4j` to build the package.

3. [Download the Datadog Agent][2].

4. Upload the build artifact to any host with an Agent and
run `datadog-agent integration install -w
path/to/resilience4j/dist/<ARTIFACT_NAME>.whl`.

### Configuration

1. Edit the `resilience4j/conf.yaml` file, in the `conf.d/` folder at the root of your Agent's configuration directory to start collecting your Resilience4j performance data. See the [sample resilience4j/conf.yaml][4] for all available configuration options.
willianccs marked this conversation as resolved.
Show resolved Hide resolved

2. [Restart the Agent][5].

### Validation

[Run the Agent's status subcommand][6] and look for `resilience4j` under the Checks section.

## Data Collected

### Metrics

See [metadata.csv][7] for a list of metrics provided by this integration.

### Service Checks

See [service_checks.json][11] for a list of service checks provided by this integration.

### Events

Resilience4j does not include any events.

## Troubleshooting

Need help? Contact [Datadog support][3].

[1]: **LINK_TO_INTEGRATION_SITE**
willianccs marked this conversation as resolved.
Show resolved Hide resolved
[2]: https://app.datadoghq.com/account/settings/agent/latest
[3]: https://docs.datadoghq.com/agent/kubernetes/integrations/
[4]: https://github.com/DataDog/integrations-extras/blob/master/resilience4j/datadog_checks/resilience4j/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-extras/blob/master/resilience4j/metadata.csv
[8]: https://github.com/DataDog/integrations-extras/blob/master/resilience4j/assets/service_checks.json
[9]: https://docs.datadoghq.com/help/

10 changes: 10 additions & 0 deletions resilience4j/assets/configuration/spec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: Resilience4j
files:
- name: resilience4j.yaml
options:
- template: init_config
options:
- template: init_config/default
- template: instances
options:
- template: instances/default
willianccs marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Please build an out-of-the-box dashboard for your integration following our best practices here: https://datadoghq.dev/integrations-core/guidelines/dashboards/#best-practices
Binary file added resilience4j/assets/resilience4j.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 17 additions & 0 deletions resilience4j/assets/service_checks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[
{
"agent_version": "7.59.0",
"integration": "resilience4j",
"check": "resilience4j.prometheus.health",
"statuses": [
"ok",
"critical"
],
"groups": [
"host",
"endpoint"
],
"name": "Resilience4j endpoint health",
"description": "Returns `CRITICAL` if the Agent is unable to connect to the Resilience4j endpoint, otherwise returns `OK`."
}
]
2 changes: 2 additions & 0 deletions resilience4j/datadog_checks/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
2 changes: 2 additions & 0 deletions resilience4j/datadog_checks/resilience4j/__about__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

__version__ = '1.0.0'
5 changes: 5 additions & 0 deletions resilience4j/datadog_checks/resilience4j/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

from .__about__ import __version__
from .check import Resilience4jCheck

__all__ = ['__version__', 'Resilience4jCheck']
39 changes: 39 additions & 0 deletions resilience4j/datadog_checks/resilience4j/check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from datadog_checks.base import OpenMetricsBaseCheck, ConfigurationError

from .metrics import METRIC_MAP


class Resilience4jCheck(OpenMetricsBaseCheck):
DEFAULT_METRIC_LIMIT = 0

def __init__(self, name, init_config, instances):
default_instances = {
'resilience4j': {
'metrics': [METRIC_MAP],
'send_distribution_sums_as_monotonic': 'true',
'send_distribution_counts_as_monotonic': 'true',
}
}

super(Resilience4jCheck, self).__init__(
name, init_config, instances, default_instances=default_instances, default_namespace='resilience4j'
)

def _http_check(self, url, check_name):
try:
response = self.http.get(url)
response.raise_for_status()
except Exception as e:
self.service_check(check_name, self.CRITICAL, message=str(e))
else:
if response.status_code == 200:
self.service_check(check_name, self.OK)
else:
self.service_check(check_name, self.WARNING)

def check(self, instance):
prometheus_url = instance.get("prometheus_url")
if prometheus_url is None:
raise ConfigurationError("Each instance must have a url to the metrics endpoint")

super(Resilience4jCheck, self).check(instance)
23 changes: 23 additions & 0 deletions resilience4j/datadog_checks/resilience4j/config_models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@


# 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 <INTEGRATION_NAME>
# ddev -x validate models -s <INTEGRATION_NAME>


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
14 changes: 14 additions & 0 deletions resilience4j/datadog_checks/resilience4j/config_models/defaults.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@


# 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 <INTEGRATION_NAME>
# ddev -x validate models -s <INTEGRATION_NAME>


def instance_empty_default_hostname():
return False


def instance_min_collection_interval():
return 15
49 changes: 49 additions & 0 deletions resilience4j/datadog_checks/resilience4j/config_models/instance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@


# 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 <INTEGRATION_NAME>
# ddev -x validate models -s <INTEGRATION_NAME>


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))
46 changes: 46 additions & 0 deletions resilience4j/datadog_checks/resilience4j/config_models/shared.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@


# 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 <INTEGRATION_NAME>
# ddev -x validate models -s <INTEGRATION_NAME>


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))
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@


# 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
Loading
Loading