Skip to content

Commit

Permalink
Add openmetrics properties to Teleport configuration spec (#18466)
Browse files Browse the repository at this point in the history
* add openmetrics template to the spec

* generate config and models

* changelog
  • Loading branch information
NouemanKHAL authored Sep 4, 2024
1 parent 4da4636 commit fd8cdf0
Show file tree
Hide file tree
Showing 6 changed files with 828 additions and 23 deletions.
41 changes: 21 additions & 20 deletions teleport/assets/configuration/spec.yaml
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
name: Teleport
files:
- name: teleport.yaml
options:
- template: init_config
- name: teleport.yaml
options:
- template: init_config/default
- template: instances
options:
- name: "teleport_url"
required: true
description: "The Teleport URL to connect to."
value:
type: string
example: "http://127.0.0.1"
- name: "diag_port"
description: "The Teleport Diagnostic Port."
value:
type: integer
example: 3000


- template: instances/default
- template: init_config
options:
- template: init_config/openmetrics
- template: instances
options:
- name: "teleport_url"
required: true
description: "The Teleport URL to connect to."
value:
type: string
example: "http://127.0.0.1"
- name: "diag_port"
description: "The Teleport Diagnostic Port."
value:
type: integer
example: 3000
- template: instances/openmetrics
overrides:
openmetrics_endpoint.hidden: true
openmetrics_endpoint.required: false
1 change: 1 addition & 0 deletions teleport/changelog.d/18466.added
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add openmetrics configuration options
112 changes: 112 additions & 0 deletions teleport/datadog_checks/teleport/config_models/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,38 @@
# ddev -x validate models -s <INTEGRATION_NAME>


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_diag_port():
return 3000

Expand All @@ -20,5 +52,85 @@ 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
114 changes: 112 additions & 2 deletions teleport/datadog_checks/teleport/config_models/instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,36 @@

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

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 ExtraMetrics(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,
Expand All @@ -28,20 +48,110 @@ class MetricPatterns(BaseModel):
include: Optional[tuple[str, ...]] = None


class Metrics(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 ShareLabels(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
diag_port: Optional[int] = 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, ExtraMetrics]]], ...]] = 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, Metrics]]], ...]] = 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: Optional[str] = None
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, ShareLabels]]] = None
skip_proxy: Optional[bool] = None
tag_by_endpoint: Optional[bool] = None
tags: Optional[tuple[str, ...]] = None
telemetry: Optional[bool] = None
teleport_url: str
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):
Expand Down
17 changes: 16 additions & 1 deletion teleport/datadog_checks/teleport/config_models/shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,17 @@
from datadog_checks.base.utils.functions import identity
from datadog_checks.base.utils.models import validation

from . import validators
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):
Expand All @@ -25,7 +35,10 @@ class SharedConfig(BaseModel):
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):
Expand All @@ -37,6 +50,8 @@ def _validate(cls, value, info):
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)

Expand Down
Loading

0 comments on commit fd8cdf0

Please sign in to comment.