|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
# Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors
|
|
|
#
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
# You may obtain a copy of the License at
|
|
|
#
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
#
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
# See the License for the specific language governing permissions and
|
|
|
# limitations under the License.
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
import sqlalchemy as sa
|
|
|
from sqlalchemy.dialects.postgresql import JSON
|
|
|
|
|
|
from ziggurat_foundations.models.base import BaseModel
|
|
|
from appenlight.lib.utils import convert_es_type
|
|
|
from appenlight.models import Base
|
|
|
|
|
|
|
|
|
class Metric(Base, BaseModel):
|
|
|
__tablename__ = "metrics"
|
|
|
__table_args__ = {"implicit_returning": False}
|
|
|
|
|
|
pkey = sa.Column(sa.BigInteger(), primary_key=True)
|
|
|
resource_id = sa.Column(
|
|
|
sa.Integer(),
|
|
|
sa.ForeignKey("applications.resource_id"),
|
|
|
nullable=False,
|
|
|
primary_key=True,
|
|
|
)
|
|
|
timestamp = sa.Column(
|
|
|
sa.DateTime(), default=datetime.utcnow, server_default=sa.func.now()
|
|
|
)
|
|
|
tags = sa.Column(JSON(), default={})
|
|
|
namespace = sa.Column(sa.Unicode(255))
|
|
|
|
|
|
@property
|
|
|
def partition_id(self):
|
|
|
return "rcae_m_%s" % self.timestamp.strftime("%Y_%m_%d")
|
|
|
|
|
|
def es_doc(self):
|
|
|
tags = {}
|
|
|
tag_list = []
|
|
|
for name, value in self.tags.items():
|
|
|
# replace dot in indexed tag name
|
|
|
name = name.replace(".", "_")
|
|
|
tag_list.append(name)
|
|
|
tags[name] = {
|
|
|
"values": convert_es_type(value),
|
|
|
"numeric_values": value
|
|
|
if (isinstance(value, (int, float)) and not isinstance(value, bool))
|
|
|
else None,
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
"metric_id": self.pkey,
|
|
|
"resource_id": self.resource_id,
|
|
|
"timestamp": self.timestamp,
|
|
|
"namespace": self.namespace,
|
|
|
"tags": tags,
|
|
|
"tag_list": tag_list,
|
|
|
}
|
|
|
|