def getModel(metricId): try: with web.ctx.connFactory() as conn: metric = repository.getMetric(conn, metricId, getMetricDisplayFields(conn)) return metric except app_exceptions.ObjectNotFoundError: raise web.notfound("ObjectNotFoundError Metric not found: Metric ID: %s" % metricId)
def formatMetricRowProxy(metricObj): if metricObj.tag_name is not None and len(metricObj.tag_name) > 0: displayName = "%s (%s)" % (metricObj.tag_name, metricObj.server) else: displayName = metricObj.server if (hasattr(metricObj, "parameters") and isinstance(metricObj.parameters, basestring)): parameters = json.loads(metricObj.parameters) else: parameters = metricObj.parameters engine = repository.engineFactory() allowedKeys = set([col.name for col in getMetricDisplayFields(engine)]) metricDict = dict((col, getattr(metricObj, col)) for col in metricObj.keys() if col in allowedKeys) metricDict["display_name"] = displayName metricDict["parameters"] = parameters return metricDict
def GET(self, period): """ Get metrics, sorted by anomalies over specified period (hours) :param period: Period (hours) over which to consider anomalies for sort order :type period: int :returns: List of metrics :rtype: list Example request:: GET /_anomalies/period/{period} Example response:: [ { "status": 1, "last_rowid": 4033, "display_name": "jenkins-master (us-west-2/AWS/EC2/i-12345678)", "description": "NetworkIn on EC2 instance i-12345678 in us-west-2", "name": "AWS/EC2/NetworkIn", "last_timestamp": "2014-04-14 20:29:00", "poll_interval": 300, "server": "us-west-2/AWS/EC2/i-12345678", "tag_name": "jenkins-master", "datasource": "cloudwatch", "location": "us-west-2", "message": null, "parameters": { "InstanceId": "i-12345678", "region": "us-west-2" }, "uid": "0b6b97022fdb4134936aae92aa67393b" }, ... ] """ try: self.addStandardHeaders() engine = repository.engineFactory() with engine.connect() as conn: modelIterator = repository.getAllMetrics(conn, fields=getMetricDisplayFields(conn)) displayValuesMap = repository.getMetricIdsSortedByDisplayValue(conn, period) # Keep track of the largest model display value for each server serverValues = defaultdict(float) modelsList = [] for model in modelIterator: val = displayValuesMap.get(model.uid) if val is not None: serverValues[model.server] = max(float(val), serverValues[model.server]) modelsList.append(convertMetricRowToMetricDict(model)) # Sort by the primary key. The order within each server is preserved # from previous sort. def getModelRankByServer(model): return (-serverValues[model["server"]], model["server"], model["name"]) modelsList = sorted(modelsList, key=getModelRankByServer) return utils.jsonEncode(modelsList) except (web.HTTPError) as ex: log.info(str(ex) or repr(ex)) raise ex except Exception as ex: log.exception("GET Failed") raise web.internalerror(str(ex) or repr(ex))
def getAllModels(): with web.ctx.connFactory() as conn: return repository.getAllModels(conn, getMetricDisplayFields(conn))
def GET(self): """ Get metrics, sorted by AWS name tag / instance ID :returns: List of metrics :rtype: list Example request:: GET /_anomalies/name Example response:: [ { "status": 1, "last_rowid": 4033, "display_name": "jenkins-master (us-west-2/AWS/EC2/i-12345678)", "description": "NetworkIn on EC2 instance i-12345678 in us-west-2", "name": "AWS/EC2/NetworkIn", "last_timestamp": "2014-04-14 20:29:00", "poll_interval": 300, "server": "us-west-2/AWS/EC2/i-12345678", "tag_name": "jenkins-master", "datasource": "cloudwatch", "location": "us-west-2", "message": null, "parameters": { "InstanceId": "i-12345678", "region": "us-west-2" }, "uid": "0b6b97022fdb4134936aae92aa67393b" }, ... ] """ try: self.addStandardHeaders() engine = repository.engineFactory() with engine.connect() as conn: modelIterator = repository.getAllMetrics(conn, fields=getMetricDisplayFields(conn)) modelsList = [convertMetricRowToMetricDict(model) for model in modelIterator] # Sort by tag_name, and then parameters=>InstanceID def cmpFn(model1, model2): name1 = model1["tag_name"] name2 = model2["tag_name"] id1 = model1["parameters"].get("InstanceID") id2 = model2["parameters"].get("InstanceID") if name1 and not name2: return -1 elif name2 and not name1: return 1 elif name1 != name2: return cmp(name1, name2) elif id1 and not id2: return -1 elif id2 and not id1: return 1 elif id1 != id2: return cmp(id1, id2) return 0 modelsList.sort(cmpFn) return utils.jsonEncode(modelsList) except (web.HTTPError) as ex: log.info(str(ex) or repr(ex)) raise ex except Exception as ex: log.exception("GET Failed") raise web.internalerror(str(ex) or repr(ex))