X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fdevops.git;a=blobdiff_plain;f=installers%2Fcharm%2Fosm-mon%2Fsrc%2Fcharm.py;h=bb98ccf057ad8b53fca0426f13039b076159b0f9;hp=45874624d8c893b8f18645890813691aeca5cf9e;hb=c5b6206a7c21cadda941762389ecadd0100418f0;hpb=87b620ace4933f30db8c4834862a57d56f9a07a6 diff --git a/installers/charm/osm-mon/src/charm.py b/installers/charm/osm-mon/src/charm.py index 45874624..bb98ccf0 100755 --- a/installers/charm/osm-mon/src/charm.py +++ b/installers/charm/osm-mon/src/charm.py @@ -42,6 +42,7 @@ from charms.osm_libs.v0.utils import ( check_service_active, ) from charms.osm_vca_integrator.v0.vca import VcaDataChangedEvent, VcaRequires +from charms.prometheus_k8s.v0.prometheus_scrape import MetricsEndpointProvider from lightkube.models.core_v1 import ServicePort from ops.charm import ActionEvent, CharmBase, CharmEvents from ops.framework import EventSource, StoredState @@ -53,7 +54,7 @@ from grafana_datasource_handler import ( GrafanaConfig, GrafanaDataSourceHandler, ) -from legacy_interfaces import KeystoneClient, PrometheusClient +from legacy_interfaces import KeystoneClient HOSTPATHS = [ HostPath( @@ -70,6 +71,7 @@ HOSTPATHS = [ ), ] SERVICE_PORT = 8000 +PROMETHEUS_RELATION = "metrics-endpoint" logger = logging.getLogger(__name__) @@ -93,7 +95,7 @@ class OsmMonCharm(CharmBase): super().__init__(*args) self.kafka = KafkaRequires(self) self.mongodb_client = DatabaseRequires(self, "mongodb", database_name="osm") - self.prometheus_client = PrometheusClient(self, "prometheus") + self._set_metrics_endpoint_provider() self.keystone_client = KeystoneClient(self, "keystone") self.vca = VcaRequires(self) self._observe_charm_events() @@ -101,6 +103,21 @@ class OsmMonCharm(CharmBase): self.debug_mode = DebugMode(self, self._stored, self.container, HOSTPATHS) self._patch_k8s_service() + def _set_metrics_endpoint_provider(self): + prometheus_jobs = [ + { + "job_name": "mon_exporter", + "static_configs": [{"targets": ["*:{}".format(SERVICE_PORT)]}], + } + ] + refresh_events = [ + self.on.mon_pebble_ready, + self.on.update_status, + ] + self.prometheus_metrics_endpoint = MetricsEndpointProvider( + self, jobs=prometheus_jobs, refresh_event=refresh_events + ) + @property def external_hostname(self) -> str: """External hostname property. @@ -146,7 +163,7 @@ class OsmMonCharm(CharmBase): self.unit.status = e.status def _on_required_relation_broken(self, _) -> None: - """Handler for the kafka-broken event.""" + """Handler for the relation-broken event.""" try: check_container_ready(self.container) check_service_active(self.container, self.service_name) @@ -230,7 +247,8 @@ class OsmMonCharm(CharmBase): self.on.list_datasources_action: self._on_list_datasources_action, self.on.delete_datasource_action: self._on_delete_datasource_action, } - for relation in [self.on[rel_name] for rel_name in ["prometheus", "keystone"]]: + + for relation in [self.on[rel_name] for rel_name in [PROMETHEUS_RELATION, "keystone"]]: event_handler_mapping[relation.relation_changed] = self._on_config_changed event_handler_mapping[relation.relation_broken] = self._on_required_relation_broken @@ -250,9 +268,13 @@ class OsmMonCharm(CharmBase): CharmError: if charm configuration is invalid. """ logger.debug("validating charm config") + self._validate_mandatory_config_is_set() + self._validate_urls_in_config() + + def _validate_mandatory_config_is_set(self): missing_configs = [] - grafana_configs = ["grafana-url", "grafana-user", "grafana-password"] - for config in grafana_configs: + mandatory_configs = ["grafana-url", "grafana-user", "grafana-password", "prometheus-url"] + for config in mandatory_configs: if not self.config.get(config): missing_configs.append(config) @@ -262,9 +284,12 @@ class OsmMonCharm(CharmBase): logger.warning(error_msg) raise CharmError(error_msg) - grafana_url = self.config["grafana-url"] - if not self._is_valid_url(grafana_url): - raise CharmError(f"Invalid value for grafana-url config: '{grafana_url}'") + def _validate_urls_in_config(self): + urls_to_validate = ["grafana-url", "prometheus-url"] + for param in urls_to_validate: + url = self.config[param] + if not self._is_valid_url(url): + raise CharmError(f"Invalid value for {param} config: '{url}'") def _is_valid_url(self, url) -> bool: return urlparse(url).hostname is not None @@ -282,7 +307,7 @@ class OsmMonCharm(CharmBase): missing_relations.append("kafka") if not self._is_database_available(): missing_relations.append("mongodb") - if self.prometheus_client.is_missing_data_in_app(): + if not self.framework.model.get_relation(PROMETHEUS_RELATION): missing_relations.append("prometheus") if self.keystone_client.is_missing_data_in_app(): missing_relations.append("keystone") @@ -318,15 +343,17 @@ class OsmMonCharm(CharmBase): "OSMMON_DATABASE_DRIVER": "mongo", "OSMMON_DATABASE_URI": self._get_mongodb_uri(), "OSMMON_DATABASE_COMMONKEY": self.config["database-commonkey"], - # Prometheus/grafana configuration - "OSMMON_PROMETHEUS_URL": f"http://{self.prometheus_client.hostname}:{self.prometheus_client.port}", - "OSMMON_PROMETHEUS_USER": self.prometheus_client.user, - "OSMMON_PROMETHEUS_PASSWORD": self.prometheus_client.password, + # Prometheus configuration + "OSMMON_PROMETHEUS_URL": self.config.get("prometheus-url", ""), + "OSMMON_PROMETHEUS_USER": "", + "OSMMON_PROMETHEUS_PASSWORD": "", + # Grafana configuration "OSMMON_GRAFANA_URL": self.config.get("grafana-url", ""), "OSMMON_GRAFANA_USER": self.config.get("grafana-user", ""), "OSMMON_GRAFANA_PASSWORD": self.config.get("grafana-password", ""), "OSMMON_KEYSTONE_ENABLED": self.config["keystone-enabled"], "OSMMON_KEYSTONE_URL": self.keystone_client.host, + # Keystone configuration "OSMMON_KEYSTONE_DOMAIN_NAME": self.keystone_client.user_domain_name, "OSMMON_KEYSTONE_SERVICE_PROJECT": self.keystone_client.service, "OSMMON_KEYSTONE_SERVICE_USER": self.keystone_client.username,