def startMonitoringWithRetries(): """ :returns: metricId """ with self.connectionFactory() as conn: with conn.begin(): repository.lockOperationExclusive( conn, repository.OperationLock.METRICS) # Check if the metric is already monitored matchingMetrics = repository.getAutostackMetricsWithMetricName( conn, autostackId, nameColumnValue, fields=[schema.metric.c.uid]) matchingMetric = next(iter(matchingMetrics), None) if matchingMetric: msg = ( "monitorMetric: Autostack modelId=%s is already " "monitoring metric=%s on resource=%s; model=%r" % (matchingMetric.uid, nameColumnValue, canonicalResourceName, matchingMetric)) self._log.warning(msg) raise YOMP.app.exceptions.MetricAlreadyMonitored( msg, uid=matchingMetric.uid) # Add a metric row for the requested metric metricDict = repository.addMetric( conn, datasource=self._DATASOURCE, name=nameColumnValue, description=metricDescription, server=canonicalResourceName, location=autostack.region, tag_name=autostack.name, parameters=htmengine.utils.jsonEncode(modelSpec), poll_interval=period, status=MetricStatus.UNMONITORED) metricId = metricDict["uid"] repository.addMetricToAutostack(conn, autostackId, metricId) # Start monitoring scalar_metric_utils.startMonitoring( conn=conn, metricId=metricId, swarmParams=swarmParams, logger=self._log) self._log.info("monitorMetric: monitoring metric=%s, stats=%r", metricId, stats) return metricId
def startMonitoringWithRetries(): """ :returns: metricId """ with self.connectionFactory() as conn: with conn.begin(): repository.lockOperationExclusive(conn, repository.OperationLock.METRICS) # Check if the metric is already monitored matchingMetrics = repository.getAutostackMetricsWithMetricName( conn, autostackId, nameColumnValue, fields=[schema.metric.c.uid]) matchingMetric = next(iter(matchingMetrics), None) if matchingMetric: msg = ("monitorMetric: Autostack modelId=%s is already " "monitoring metric=%s on resource=%s; model=%r" % (matchingMetric.uid, nameColumnValue, canonicalResourceName, matchingMetric)) self._log.warning(msg) raise YOMP.app.exceptions.MetricAlreadyMonitored( msg, uid=matchingMetric.uid) # Add a metric row for the requested metric metricDict = repository.addMetric( conn, datasource=self._DATASOURCE, name=nameColumnValue, description=metricDescription, server=canonicalResourceName, location=autostack.region, tag_name=autostack.name, parameters=htmengine.utils.jsonEncode(modelSpec), poll_interval=period, status=MetricStatus.UNMONITORED) metricId = metricDict["uid"] repository.addMetricToAutostack(conn, autostackId, metricId) # Start monitoring scalar_metric_utils.startMonitoring( conn=conn, metricId=metricId, swarmParams=swarmParams, logger=self._log) self._log.info("monitorMetric: monitoring metric=%s, stats=%r", metricId, stats) return metricId
def startMonitoringWithRetries(): """ :returns: metricId """ with self.connectionFactory() as conn: with conn.begin(): repository.lockOperationExclusive( conn, repository.OperationLock.METRICS) # Check if the metric is already monitored matchingMetrics = repository.getCloudwatchMetricsForNameAndServer( conn, nameColumnValue, canonicalResourceName, fields=[ schema.metric.c.uid, schema.metric.c.parameters ]) for m in matchingMetrics: parameters = htmengine.utils.jsonDecode(m.parameters) if (parameters["metricSpec"]["dimensions"] == metricSpec["dimensions"]): msg = ( "monitorMetric: Cloudwatch modelId=%s is already " "monitoring metric=%s on resource=%s; model=%r" % (m.uid, nameColumnValue, canonicalResourceName, m)) self._log.warning(msg) raise htm.it.app.exceptions.MetricAlreadyMonitored( msg, uid=m.uid) # Add a metric row for the requested metric metricDict = repository.addMetric( conn, name=nameColumnValue, description=metricDescription, server=canonicalResourceName, location=resourceLocation, poll_interval=metricPeriod, status=MetricStatus.UNMONITORED, datasource=self._DATASOURCE, parameters=htmengine.utils.jsonEncode(modelSpec), tag_name=resourceName) metricId = metricDict["uid"] self._log.info("monitorMetric: metric=%s, stats=%r", metricId, stats) # Start monitoring scalar_metric_utils.startMonitoring( conn=conn, metricId=metricId, swarmParams=swarmParams, logger=self._log) return metricId
def startMonitoringWithRetries(): """ :returns: metricId """ with self.connectionFactory() as conn: with conn.begin(): repository.lockOperationExclusive(conn, repository.OperationLock.METRICS) # Check if the metric is already monitored matchingMetrics = repository.getCloudwatchMetricsForNameAndServer( conn, nameColumnValue, canonicalResourceName, fields=[schema.metric.c.uid, schema.metric.c.parameters], ) for m in matchingMetrics: parameters = htmengine.utils.jsonDecode(m.parameters) if parameters["metricSpec"]["dimensions"] == metricSpec["dimensions"]: msg = ( "monitorMetric: Cloudwatch modelId=%s is already " "monitoring metric=%s on resource=%s; model=%r" % (m.uid, nameColumnValue, canonicalResourceName, m) ) self._log.warning(msg) raise grok.app.exceptions.MetricAlreadyMonitored(msg, uid=m.uid) # Add a metric row for the requested metric metricDict = repository.addMetric( conn, name=nameColumnValue, description=metricDescription, server=canonicalResourceName, location=resourceLocation, poll_interval=metricPeriod, status=MetricStatus.UNMONITORED, datasource=self._DATASOURCE, parameters=htmengine.utils.jsonEncode(modelSpec), tag_name=resourceName, ) metricId = metricDict["uid"] self._log.info("monitorMetric: metric=%s, stats=%r", metricId, stats) # Start monitoring scalar_metric_utils.startMonitoring( conn=conn, metricId=metricId, swarmParams=swarmParams, logger=self._log ) return metricId
def _startMonitoringWithRetries(self, metricId, modelSpec, swarmParams): """ Perform the start-monitoring operation atomically/reliably :param metricId: unique identifier of the metric row :param modelSpec: same as `modelSpec`` from `monitorMetric` :param swarmParams: object returned by scalar_metric_utils.generateSwarmParams() :raises htmengine.exceptions.ObjectNotFoundError: if referenced metric doesn't exist :raises htmengine.exceptions.MetricNotSupportedError: if requested metric isn't supported :raises htmengine.exceptions.MetricAlreadyMonitored: if the metric is already being monitored """ with self.connectionFactory() as conn: with conn.begin(): # Lock the metric to synchronize with metric streamer; must be first # call at start of transaction metricObj = repository.getMetricWithUpdateLock(conn, metricId) if metricObj.datasource != self._DATASOURCE: raise TypeError("Not an HTM metric=%r; modelSpec=%r" % (metricObj, modelSpec)) if metricObj.status != MetricStatus.UNMONITORED: self._log.info( "monitorMetric: already monitored; metric=%r", metricObj) raise app_exceptions.MetricAlreadyMonitored( ("Custom metric=%s is already monitored by model=%r" % ( metricObj.name, metricObj, )), uid=metricId) # Save model specification in metric row update = {"parameters": htmengine.utils.jsonEncode(modelSpec)} instanceName = self.getInstanceNameForModelSpec(modelSpec) if instanceName is not None: update["server"] = instanceName repository.updateMetricColumns(conn, metricId, update) modelStarted = scalar_metric_utils.startMonitoring( conn=conn, metricId=metricId, swarmParams=swarmParams, logger=self._log) if modelStarted: scalar_metric_utils.sendBacklogDataToModel( conn=conn, metricId=metricId, logger=self._log)
def _startMonitoringWithRetries(self, metricId, modelSpec, swarmParams): """ Perform the start-monitoring operation atomically/reliably :param metricId: unique identifier of the metric row :param modelSpec: same as `modelSpec`` from `monitorMetric` :param swarmParams: object returned by scalar_metric_utils.generateSwarmParams() :raises htmengine.exceptions.ObjectNotFoundError: if referenced metric doesn't exist :raises htmengine.exceptions.MetricNotSupportedError: if requested metric isn't supported :raises htmengine.exceptions.MetricAlreadyMonitored: if the metric is already being monitored """ with self.connectionFactory() as conn: with conn.begin(): # Lock the metric to synchronize with metric streamer; must be first # call at start of transaction metricObj = repository.getMetricWithUpdateLock(conn, metricId) if metricObj.datasource != self._DATASOURCE: raise TypeError("Not an HTM metric=%r; modelSpec=%r" % (metricObj, modelSpec)) if metricObj.status != MetricStatus.UNMONITORED: self._log.info("monitorMetric: already monitored; metric=%r", metricObj) raise app_exceptions.MetricAlreadyMonitored( ("Custom metric=%s is already monitored by model=%r" % (metricObj.name, metricObj,)), uid=metricId) # Save model specification in metric row update = {"parameters": htmengine.utils.jsonEncode(modelSpec)} instanceName = self.getInstanceNameForModelSpec(modelSpec) if instanceName is not None: update["server"] = instanceName repository.updateMetricColumns(conn, metricId, update) modelStarted = scalar_metric_utils.startMonitoring( conn=conn, metricId=metricId, swarmParams=swarmParams, logger=self._log) if modelStarted: scalar_metric_utils.sendBacklogDataToModel( conn=conn, metricId=metricId, logger=self._log)