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

Add SpiceDB community integration #2538

Open
wants to merge 61 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
6381c23
Initial commit
tstirrat15 Nov 15, 2024
374f023
Add configuration spec based on cockroach spec
tstirrat15 Nov 15, 2024
0f6b69e
Regen config_models off of spec
tstirrat15 Nov 15, 2024
6f2a378
Regen example config off of spec
tstirrat15 Nov 15, 2024
0f0db17
Add metrics definition file in the style of cockroach and add checks …
tstirrat15 Nov 15, 2024
4ac152f
Copy service checks from cockroach
tstirrat15 Dec 2, 2024
c848aa9
Put spicedb version in hatch.toml
tstirrat15 Dec 2, 2024
069bcdd
Add authzed as an optional dependency
tstirrat15 Dec 2, 2024
0186d70
Add test files
tstirrat15 Dec 2, 2024
c24ff3a
Add a test util file
tstirrat15 Dec 2, 2024
3e93005
Add a docker folder
tstirrat15 Dec 2, 2024
f8d508c
Add a fixtures file
tstirrat15 Dec 2, 2024
6ae324c
Start fleshing out conftest
tstirrat15 Dec 2, 2024
5472127
Add a todo
tstirrat15 Dec 2, 2024
d785a02
Finish fleshing out metrics
tstirrat15 Dec 2, 2024
6773455
Set histogram configuration by default
tstirrat15 Dec 2, 2024
707d172
Run ruff format
tstirrat15 Dec 2, 2024
4dc4a33
Make histogram as distribution on by default
tstirrat15 Dec 2, 2024
54df4c9
Fix reference
tstirrat15 Dec 3, 2024
f4ee182
Fix test error by disabling chekc
tstirrat15 Dec 3, 2024
fd9e314
Re-add deps to keep hatch happy
tstirrat15 Dec 3, 2024
729536f
Fix references
tstirrat15 Dec 3, 2024
c64b4b0
Add get_expected_metrics
tstirrat15 Dec 3, 2024
7e95ded
use get_expected_metrics
tstirrat15 Dec 3, 2024
6803970
Reorganize metrics
tstirrat15 Dec 3, 2024
b8e53a1
Fill out metadata csv
tstirrat15 Dec 4, 2024
c3892e0
Reorganize metrics to provide types
tstirrat15 Dec 4, 2024
d86185c
Fix tag name
tstirrat15 Dec 4, 2024
a596a28
Get unit tests running
tstirrat15 Dec 4, 2024
8cd73f5
Fix port, split up histogram and non-histogram metrics
tstirrat15 Dec 4, 2024
d1bf884
Fix fixture invocation and key
tstirrat15 Dec 4, 2024
f49eed6
Add integration test
tstirrat15 Dec 4, 2024
3d555ab
Add e2e test
tstirrat15 Dec 4, 2024
8418320
Add fleshed-out dockerfile
tstirrat15 Dec 4, 2024
5391196
Sync ci
tstirrat15 Dec 4, 2024
a016e2a
Undo formatting changse
tstirrat15 Dec 4, 2024
82c12b8
Add images to repo
tstirrat15 Dec 4, 2024
0f0d3c9
Add TODO
tstirrat15 Dec 4, 2024
435e8bc
Add codeowner line for spicedb
tstirrat15 Dec 4, 2024
9c13b90
Add starter dashboard
tstirrat15 Dec 4, 2024
038a183
Flesh out spicedb manifest file
tstirrat15 Dec 4, 2024
9cea1e4
Shorten description
tstirrat15 Dec 4, 2024
ea185e7
Fix unit
tstirrat15 Dec 5, 2024
b80596e
Flesh out readme
tstirrat15 Dec 5, 2024
b9e6393
Update spicedb/README.md
tstirrat15 Dec 6, 2024
2ee3c3b
Update spicedb/README.md
tstirrat15 Dec 6, 2024
ac77f8d
Update spicedb/README.md
tstirrat15 Dec 6, 2024
a1cfb59
Update spicedb/README.md
tstirrat15 Dec 6, 2024
3023db1
Update spicedb/README.md
tstirrat15 Dec 6, 2024
ef9ec6b
Format dashboard
tstirrat15 Dec 6, 2024
3718eba
Remove readme
tstirrat15 Dec 6, 2024
da8ae0b
Update spicedb/README.md
tstirrat15 Dec 7, 2024
8cfe890
Update spicedb/CHANGELOG.md
tstirrat15 Dec 7, 2024
8093de5
Use open-source image for thumper
tstirrat15 Dec 12, 2024
d54b74f
Merge branch 'add-spicedb-integration' of github.com:tstirrat15/integ…
tstirrat15 Dec 12, 2024
1867002
Fix merge conflicts
tstirrat15 Dec 12, 2024
7df9e90
Run black
tstirrat15 Dec 18, 2024
8df39f9
Ruff as well
tstirrat15 Dec 18, 2024
c2735ba
Fix import sort
tstirrat15 Dec 18, 2024
31c683b
Add noqa to stop ruff and black from fighting
tstirrat15 Dec 18, 2024
8ba8171
Last one
tstirrat15 Dec 18, 2024
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
Prev Previous commit
Next Next commit
Run ruff format
tstirrat15 committed Dec 2, 2024
commit 707d17261e24c4100ff297d54f2967fdf43364bc
3 changes: 1 addition & 2 deletions spicedb/datadog_checks/spicedb/__about__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@

__version__ = '1.0.0'
__version__ = "1.0.0"
16 changes: 8 additions & 8 deletions spicedb/datadog_checks/spicedb/check.py
Original file line number Diff line number Diff line change
@@ -11,17 +11,17 @@


class SpicedbCheck(OpenMetricsBaseCheckv2, ConfigMixin):

# This will be the prefix of every metric and service check the integration sends
__NAMESPACE__ = 'spicedb'
__NAMESPACE__ = "spicedb"

def get_default_config(self):
"""
Provides a default configuration, e.g. for tests.
Provides a default configuration. Anything configured by the user overrides this,
but this is where we provide the metrics definitions used by the scraper.
"""
return {
# TODO: this is technically the prometheus endpoint, not the openmetrics endpoint
# Need to see if that'll be a problem.
'openmetrics_endpoint': 'http://localhost:9090/metrics',
'metrics': METRICS_CONFIG
}
# TODO: this is technically the prometheus endpoint, not the openmetrics endpoint
# Need to see if that'll be a problem.
"openmetrics_endpoint": "http://localhost:9090/metrics",
"metrics": METRICS_CONFIG,
}
6 changes: 3 additions & 3 deletions spicedb/datadog_checks/spicedb/config_models/defaults.py
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@ def instance_allow_redirects():


def instance_auth_type():
return 'basic'
return "basic"


def instance_cache_metric_wildcards():
@@ -57,7 +57,7 @@ def instance_ignore_connection_errors():


def instance_kerberos_auth():
return 'disabled'
return "disabled"


def instance_kerberos_delegate():
@@ -81,7 +81,7 @@ def instance_non_cumulative_histogram_buckets():


def instance_openmetrics_endpoint():
return 'http://localhost:9090/metrics'
return "http://localhost:9090/metrics"


def instance_persist_connections():
22 changes: 11 additions & 11 deletions spicedb/datadog_checks/spicedb/config_models/instance.py
Original file line number Diff line number Diff line change
@@ -28,7 +28,7 @@ class AuthToken(BaseModel):
class ExtraMetrics(BaseModel):
model_config = ConfigDict(
arbitrary_types_allowed=True,
extra='allow',
extra="allow",
frozen=True,
)
name: Optional[str] = None
@@ -47,7 +47,7 @@ class MetricPatterns(BaseModel):
class Metrics(BaseModel):
model_config = ConfigDict(
arbitrary_types_allowed=True,
extra='allow',
extra="allow",
frozen=True,
)
name: Optional[str] = None
@@ -116,7 +116,7 @@ class InstanceConfig(BaseModel):
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*')
namespace: Optional[str] = Field(None, pattern="\\w*")
non_cumulative_histogram_buckets: Optional[bool] = None
ntlm_domain: Optional[str] = None
openmetrics_endpoint: Optional[str] = None
@@ -147,21 +147,21 @@ class InstanceConfig(BaseModel):
use_process_start_time: Optional[bool] = None
username: Optional[str] = None

@model_validator(mode='before')
@model_validator(mode="before")
def _initial_validation(cls, values):
return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values))
return validation.core.initialize_config(getattr(validators, "initialize_instance", identity)(values))

@field_validator('*', mode='before')
@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)
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)()
value = getattr(defaults, f"instance_{info.field_name}", lambda: value)()

return validation.utils.make_immutable(value)

@model_validator(mode='after')
@model_validator(mode="after")
def _final_validation(cls, model):
return validation.core.check_model(getattr(validators, 'check_instance', identity)(model))
return validation.core.check_model(getattr(validators, "check_instance", identity)(model))
16 changes: 8 additions & 8 deletions spicedb/datadog_checks/spicedb/config_models/shared.py
Original file line number Diff line number Diff line change
@@ -36,21 +36,21 @@ class SharedConfig(BaseModel):
skip_proxy: Optional[bool] = None
timeout: Optional[float] = None

@model_validator(mode='before')
@model_validator(mode="before")
def _initial_validation(cls, values):
return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values))
return validation.core.initialize_config(getattr(validators, "initialize_shared", identity)(values))

@field_validator('*', mode='before')
@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)
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)()
value = getattr(defaults, f"shared_{info.field_name}", lambda: value)()

return validation.utils.make_immutable(value)

@model_validator(mode='after')
@model_validator(mode="after")
def _final_validation(cls, model):
return validation.core.check_model(getattr(validators, 'check_shared', identity)(model))
return validation.core.check_model(getattr(validators, "check_shared", identity)(model))
2 changes: 0 additions & 2 deletions spicedb/datadog_checks/spicedb/config_models/validators.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


# Here you can include additional config validators or transformers
#
# def initialize_instance(values, **kwargs):
21 changes: 11 additions & 10 deletions spicedb/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -5,23 +5,24 @@

from .util import HOST, PORT

@pytest.fixture(scope='session')

@pytest.fixture(scope="session")
def dd_environment(instance):
env_vars = {"SPICEDB_GRPC_PRESHARED_KEY": "some random key"}

with docker_run(
os.path.join(get_here(), "docker", "docker-compose.yml"),
env_vars=env_vars,
endpoints=instance['openmetrics_endpoint'],
conditions=None,
):
os.path.join(get_here(), "docker", "docker-compose.yml"),
env_vars=env_vars,
endpoints=instance["openmetrics_endpoint"],
conditions=None,
):
yield instance


@pytest.fixture
def instance(scope='session'):
def instance(scope="session"):
return {
'openmetrics_endpoint': 'http://{}:{}/metrics'.format(HOST, PORT),
'histogram_buckets_as_distributions': True,
'tags': ['cluster:cockroachdb-cluster', 'node:1'],
"openmetrics_endpoint": "http://{}:{}/metrics".format(HOST, PORT),
"histogram_buckets_as_distributions": True,
"tags": ["cluster:cockroachdb-cluster", "node:1"],
}
1 change: 0 additions & 1 deletion spicedb/tests/test_e2e.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

def test_metrics(dd_agent_check, instance):
aggregator = dd_agent_check(instance, rate=True)
expected_metrics = []
6 changes: 3 additions & 3 deletions spicedb/tests/test_integration.py
Original file line number Diff line number Diff line change
@@ -5,19 +5,19 @@
from datadog_checks.dev.utils import assert_service_checks, get_metadata_metrics

# NOTE: this is the same as annotating all of the test functions in this file with the dd_environment fixture.
pytestmark = [pytest.mark.usefixtures('dd_environment')]
pytestmark = [pytest.mark.usefixtures("dd_environment")]


def test_metrics(aggregator, instance, dd_run_check):
check = CockroachdbCheck('spicedb', {}, [instance])
check = CockroachdbCheck("spicedb", {}, [instance])
dd_run_check(check)

expected_metrics = []

for metric in expected_metrics:
aggregator.assert_metric(f"spicedb.{metric}", at_least=0)

aggregator.assert_service_check('spicedb.openmetrics.health', ServiceCheck.OK)
aggregator.assert_service_check("spicedb.openmetrics.health", ServiceCheck.OK)
aggregator.assert_metrics_using_metadata(get_metadata_metrics(), check_submission_type=True)

assert_service_checks(aggregator)
16 changes: 7 additions & 9 deletions spicedb/tests/test_unit.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


from typing import Any, Callable, Dict # noqa: F401

from datadog_checks.base import AgentCheck # noqa: F401
@@ -12,24 +10,24 @@

def test_metrics(aggregator, instance, dd_run_check, mock_http_response):
mock_http_response(file_path=get_fixture_path("all_metrics.txt"))
dd_run_check(SpicedbCheck('spicedb', {}, [instance]))
dd_run_check(SpicedbCheck("spicedb", {}, [instance]))

tags = ['cluster:spicedb-cluster', 'endpoint:http://localhost:9090/metrics', 'node:1', 'node_id:1']
tags = ["cluster:spicedb-cluster", "endpoint:http://localhost:9090/metrics", "node:1", "node_id:1"]

# TODO:
for metric in metrics:
aggregator.assert_metric('spicedb.{}'.format(metric))
aggregator.assert_metric("spicedb.{}".format(metric))
for tag in tags:
aggregator.assert_metric_has_tag('spicedb.{}'.format(metric), tag)
aggregator.assert_metric_has_tag("spicedb.{}".format(metric), tag)

aggregator.assert_service_check('cockroachdb.prometheus.health', ServiceCheck.OK)
aggregator.assert_service_check("cockroachdb.prometheus.health", ServiceCheck.OK)
aggregator.assert_all_metrics_covered()
aggregator.assert_metrics_using_metadata(get_metadata_metrics(), check_submission_type=True)

assert_service_checks(aggregator)


def test_emits_critical_service_check_when_service_is_down(dd_run_check, aggregator, instance):
check = SpicedbCheck('spicedb', {}, [instance])
check = SpicedbCheck("spicedb", {}, [instance])
dd_run_check(check)
aggregator.assert_service_check('spicedb.prometheus.health', SpicedbCheck.CRITICAL)
aggregator.assert_service_check("spicedb.prometheus.health", SpicedbCheck.CRITICAL)
5 changes: 3 additions & 2 deletions spicedb/tests/util.py
Original file line number Diff line number Diff line change
@@ -3,7 +3,8 @@
from datadog_checks.dev import get_docker_hostname, get_here

HOST = get_docker_hostname()
PORT = '8080'
PORT = "8080"


def get_fixture_path(filename):
return os.path.join(get_here(), 'fixtures', filename)
return os.path.join(get_here(), "fixtures", filename)

Unchanged files with check annotations Beta

{

Check failure on line 1 in spicedb/manifest.json

datadog-assets / validate-logs

Error in logs

{'tile': {'media': {0: {'image_url': ['String does not match expected pattern.']}, 1: {'image_url': ['String does not match expected pattern.']}, 2: {'image_url': ['String does not match expected pattern.']}}, 'classifier_tags': {0: ['Not a valid choice.'], 4: ['Not a valid choice.'], 5: ['Not a valid choice.'], 6: ['Not a valid choice.'], 7: ['Not a valid choice.']}}, 'author': {'homepage': ['Not a valid URL.', 'Shorter than minimum length 1.'], 'sales_email': ['Not a valid email address.']}}
"manifest_version": "2.0.0",
"app_uuid": "3084d0f4-cf4c-493f-9a0d-5754555da0b2",
"app_id": "spicedb",