# What this PR does based on this PR - https://github.com/grafana/oncall/pull/4517 ## Which issue(s) this PR closes Related to https://github.com/grafana/oncall/issues/4455 ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] Added the relevant release notes label (see labels prefixed w/ `release:`). These labels dictate how your PR will show up in the autogenerated release notes.
252 lines
9 KiB
Python
252 lines
9 KiB
Python
import pytest
|
|
from django.core.cache import cache
|
|
|
|
from apps.metrics_exporter.constants import (
|
|
ALERT_GROUPS_RESPONSE_TIME,
|
|
ALERT_GROUPS_TOTAL,
|
|
NO_SERVICE_VALUE,
|
|
USER_WAS_NOTIFIED_OF_ALERT_GROUPS,
|
|
)
|
|
from apps.metrics_exporter.helpers import (
|
|
get_metric_alert_groups_response_time_key,
|
|
get_metric_alert_groups_total_key,
|
|
get_metric_user_was_notified_of_alert_groups_key,
|
|
)
|
|
|
|
METRICS_TEST_INTEGRATION_NAME = "Test integration"
|
|
METRICS_TEST_ORG_ID = 123 # random number
|
|
METRICS_TEST_INSTANCE_SLUG = "test_instance"
|
|
METRICS_TEST_INSTANCE_ID = 292 # random number
|
|
METRICS_TEST_USER_USERNAME = "Alex"
|
|
METRICS_TEST_SERVICE_NAME = "test_service"
|
|
|
|
|
|
@pytest.fixture()
|
|
def mock_cache_get_metrics_for_collector(monkeypatch):
|
|
def _mock_cache_get(key, *args, **kwargs):
|
|
if ALERT_GROUPS_TOTAL in key:
|
|
key = ALERT_GROUPS_TOTAL
|
|
elif ALERT_GROUPS_RESPONSE_TIME in key:
|
|
key = ALERT_GROUPS_RESPONSE_TIME
|
|
elif USER_WAS_NOTIFIED_OF_ALERT_GROUPS in key:
|
|
key = USER_WAS_NOTIFIED_OF_ALERT_GROUPS
|
|
test_metrics = {
|
|
ALERT_GROUPS_TOTAL: {
|
|
1: {
|
|
"integration_name": "Test metrics integration",
|
|
"team_name": "Test team",
|
|
"team_id": 1,
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 1,
|
|
"services": {
|
|
NO_SERVICE_VALUE: {
|
|
"firing": 2,
|
|
"silenced": 4,
|
|
"acknowledged": 3,
|
|
"resolved": 5,
|
|
},
|
|
METRICS_TEST_SERVICE_NAME: {
|
|
"firing": 12,
|
|
"silenced": 14,
|
|
"acknowledged": 13,
|
|
"resolved": 15,
|
|
},
|
|
},
|
|
},
|
|
2: {
|
|
"integration_name": "Empty integration",
|
|
"team_name": "Test team",
|
|
"team_id": 1,
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 2,
|
|
"services": {
|
|
NO_SERVICE_VALUE: {
|
|
"firing": 0,
|
|
"silenced": 0,
|
|
"acknowledged": 0,
|
|
"resolved": 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
ALERT_GROUPS_RESPONSE_TIME: {
|
|
1: {
|
|
"integration_name": "Test metrics integration",
|
|
"team_name": "Test team",
|
|
"team_id": 1,
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 1,
|
|
"services": {NO_SERVICE_VALUE: [2, 10, 200, 650], METRICS_TEST_SERVICE_NAME: [4, 12, 20]},
|
|
},
|
|
2: {
|
|
"integration_name": "Empty integration",
|
|
"team_name": "Test team",
|
|
"team_id": 1,
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 2,
|
|
"services": {
|
|
# if there are no response times available, this integration will be ignored
|
|
NO_SERVICE_VALUE: [],
|
|
},
|
|
},
|
|
},
|
|
USER_WAS_NOTIFIED_OF_ALERT_GROUPS: {
|
|
1: {
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 1,
|
|
"user_username": "Alex",
|
|
"counter": 4,
|
|
}
|
|
},
|
|
}
|
|
return test_metrics.get(key)
|
|
|
|
def _mock_cache_get_many(keys, *args, **kwargs):
|
|
return {key: _mock_cache_get(key) for key in keys if _mock_cache_get(key)}
|
|
|
|
monkeypatch.setattr(cache, "get", _mock_cache_get)
|
|
monkeypatch.setattr(cache, "get_many", _mock_cache_get_many)
|
|
|
|
|
|
@pytest.fixture()
|
|
def mock_cache_get_old_metrics_for_collector(monkeypatch):
|
|
def _mock_cache_get(key, *args, **kwargs):
|
|
if ALERT_GROUPS_TOTAL in key:
|
|
key = ALERT_GROUPS_TOTAL
|
|
elif ALERT_GROUPS_RESPONSE_TIME in key:
|
|
key = ALERT_GROUPS_RESPONSE_TIME
|
|
elif USER_WAS_NOTIFIED_OF_ALERT_GROUPS in key:
|
|
key = USER_WAS_NOTIFIED_OF_ALERT_GROUPS
|
|
test_metrics = {
|
|
ALERT_GROUPS_TOTAL: {
|
|
1: {
|
|
"integration_name": "Test metrics integration",
|
|
"team_name": "Test team",
|
|
"team_id": 1,
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 1,
|
|
"firing": 2,
|
|
"silenced": 4,
|
|
"acknowledged": 3,
|
|
"resolved": 5,
|
|
},
|
|
},
|
|
ALERT_GROUPS_RESPONSE_TIME: {
|
|
1: {
|
|
"integration_name": "Test metrics integration",
|
|
"team_name": "Test team",
|
|
"team_id": 1,
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 1,
|
|
"response_time": [2, 10, 200, 650],
|
|
},
|
|
},
|
|
USER_WAS_NOTIFIED_OF_ALERT_GROUPS: {
|
|
1: {
|
|
"org_id": 1,
|
|
"slug": "Test stack",
|
|
"id": 1,
|
|
"user_username": "Alex",
|
|
"counter": 4,
|
|
}
|
|
},
|
|
}
|
|
return test_metrics.get(key)
|
|
|
|
def _mock_cache_get_many(keys, *args, **kwargs):
|
|
return {key: _mock_cache_get(key) for key in keys if _mock_cache_get(key)}
|
|
|
|
monkeypatch.setattr(cache, "get", _mock_cache_get)
|
|
monkeypatch.setattr(cache, "get_many", _mock_cache_get_many)
|
|
|
|
|
|
@pytest.fixture()
|
|
def mock_get_metrics_cache(monkeypatch):
|
|
def _mock_cache_get(key, *args, **kwargs):
|
|
return {}
|
|
|
|
def _mock_cache_get_many(keys, *args, **kwargs):
|
|
return {}
|
|
|
|
monkeypatch.setattr(cache, "get", _mock_cache_get)
|
|
monkeypatch.setattr(cache, "get_many", _mock_cache_get_many)
|
|
|
|
|
|
@pytest.fixture
|
|
def make_metrics_cache_params(monkeypatch):
|
|
def _make_cache_params(integration_id, organization_id, team_name=None, team_id=None):
|
|
team_name = team_name or "No team"
|
|
team_id = team_id or "no_team"
|
|
metric_alert_groups_total_key = get_metric_alert_groups_total_key(organization_id)
|
|
metric_alert_groups_response_time_key = get_metric_alert_groups_response_time_key(organization_id)
|
|
|
|
def cache_get(key, *args, **kwargs):
|
|
metrics_data = {
|
|
metric_alert_groups_response_time_key: {
|
|
integration_id: {
|
|
"integration_name": METRICS_TEST_INTEGRATION_NAME,
|
|
"team_name": team_name,
|
|
"team_id": team_id,
|
|
"org_id": METRICS_TEST_ORG_ID,
|
|
"slug": METRICS_TEST_INSTANCE_SLUG,
|
|
"id": METRICS_TEST_INSTANCE_ID,
|
|
"services": {
|
|
NO_SERVICE_VALUE: [],
|
|
},
|
|
}
|
|
},
|
|
metric_alert_groups_total_key: {
|
|
integration_id: {
|
|
"integration_name": METRICS_TEST_INTEGRATION_NAME,
|
|
"team_name": team_name,
|
|
"team_id": team_id,
|
|
"org_id": METRICS_TEST_ORG_ID,
|
|
"slug": METRICS_TEST_INSTANCE_SLUG,
|
|
"id": METRICS_TEST_INSTANCE_ID,
|
|
"services": {
|
|
NO_SERVICE_VALUE: {
|
|
"firing": 0,
|
|
"silenced": 0,
|
|
"acknowledged": 0,
|
|
"resolved": 0,
|
|
},
|
|
},
|
|
}
|
|
},
|
|
}
|
|
return metrics_data.get(key, {})
|
|
|
|
return cache_get
|
|
|
|
return _make_cache_params
|
|
|
|
|
|
@pytest.fixture
|
|
def make_user_was_notified_metrics_cache_params(monkeypatch):
|
|
def _make_cache_params(user_id, organization_id):
|
|
metric_user_was_notified_key = get_metric_user_was_notified_of_alert_groups_key(organization_id)
|
|
|
|
def cache_get(key, *args, **kwargs):
|
|
metrics_data = {
|
|
metric_user_was_notified_key: {
|
|
user_id: {
|
|
"org_id": METRICS_TEST_ORG_ID,
|
|
"slug": METRICS_TEST_INSTANCE_SLUG,
|
|
"id": METRICS_TEST_INSTANCE_ID,
|
|
"user_username": METRICS_TEST_USER_USERNAME,
|
|
"counter": 1,
|
|
}
|
|
},
|
|
}
|
|
return metrics_data.get(key, {})
|
|
|
|
return cache_get
|
|
|
|
return _make_cache_params
|