| # |
| # Copyright 2016 Yahoo Inc. |
| # |
| # 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 __future__ import unicode_literals |
| |
| from django.utils.encoding import python_2_unicode_compatible |
| from django.db.models import * |
| from django.urls import reverse |
| |
| # Used to store the latest |
| class LatestTimestamp(Model): |
| name = CharField(max_length=10, unique=True) |
| timestamp = BigIntegerField(default=0) |
| |
| @python_2_unicode_compatible |
| class Cluster(Model): |
| name = CharField(max_length=200, unique=True) |
| serviceUrl = URLField() |
| |
| def __str__(self): |
| return self.name |
| |
| @python_2_unicode_compatible |
| class Broker(Model): |
| url = URLField(db_index=True) |
| cluster = ForeignKey(Cluster, on_delete=SET_NULL, db_index=True, null=True) |
| |
| def __str__(self): |
| return self.url |
| |
| @python_2_unicode_compatible |
| class ActiveBroker(Model): |
| broker = ForeignKey(Broker, on_delete=SET_NULL, db_index=True, null=True) |
| timestamp = BigIntegerField(db_index=True) |
| |
| def __str__(self): |
| return self.url |
| |
| @python_2_unicode_compatible |
| class Property(Model): |
| name = CharField(max_length=200, unique=True) |
| |
| def __str__(self): |
| return self.name |
| |
| class Meta: |
| verbose_name_plural = 'properties' |
| |
| @python_2_unicode_compatible |
| class Namespace(Model): |
| name = CharField(max_length=200, unique=True) |
| property = ForeignKey(Property, on_delete=SET_NULL, db_index=True, null=True) |
| clusters = ManyToManyField(Cluster) |
| |
| def is_global(self): |
| return self.name.split('/', 2)[1] == 'global' |
| |
| def __str__(self): |
| return self.name |
| |
| @python_2_unicode_compatible |
| class Bundle(Model): |
| timestamp = BigIntegerField(db_index=True) |
| broker = ForeignKey(Broker, on_delete=SET_NULL, db_index=True, null=True) |
| namespace = ForeignKey(Namespace, on_delete=SET_NULL, db_index=True, null=True) |
| cluster = ForeignKey(Cluster, on_delete=SET_NULL, db_index=True, null=True) |
| range = CharField(max_length=200) |
| |
| def __str__(self): |
| return str(self.pk) + '--' + self.namespace.name + '/' + self.range |
| |
| @python_2_unicode_compatible |
| class Topic(Model): |
| name = CharField(max_length=1024, db_index=True) |
| active_broker = ForeignKey(ActiveBroker, on_delete=SET_NULL, db_index=True, null=True) |
| broker = ForeignKey(Broker, on_delete=SET_NULL, db_index=True, null=True) |
| namespace = ForeignKey(Namespace, on_delete=SET_NULL, db_index=True, null=True) |
| cluster = ForeignKey(Cluster, on_delete=SET_NULL, db_index=True, null=True) |
| bundle = ForeignKey(Bundle, on_delete=SET_NULL, db_index=True, null=True) |
| |
| timestamp = BigIntegerField(db_index=True) |
| averageMsgSize = IntegerField(default=0) |
| msgRateIn = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgRateOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgThroughputIn = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgThroughputOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| pendingAddEntriesCount = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| producerCount = IntegerField(default=0) |
| subscriptionCount = IntegerField(default=0) |
| consumerCount = IntegerField(default=0) |
| storageSize = BigIntegerField(default=0) |
| backlog = BigIntegerField(default=0) |
| |
| localRateIn = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| localRateOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| localThroughputIn = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| localThroughputOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| |
| replicationRateIn = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| replicationRateOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| replicationThroughputIn = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| replicationThroughputOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| replicationBacklog = BigIntegerField(default=0) |
| |
| def short_name(self): |
| return self.name.split('/', 5)[-1] |
| |
| def is_global(self): |
| return self.namespace.is_global() |
| |
| def url_name(self): |
| return '/'.join(self.name.split('://', 1)) |
| |
| def get_absolute_url(self): |
| url = reverse('topic', args=[self.url_name()]) |
| if self.namespace.is_global(): |
| url += '?cluster=' + self.cluster.name |
| return url |
| |
| class Meta: |
| index_together = ('name', 'cluster', 'timestamp') |
| |
| def __str__(self): |
| return self.name |
| |
| @python_2_unicode_compatible |
| class Subscription(Model): |
| name = CharField(max_length=200) |
| topic = ForeignKey(Topic, on_delete=SET_NULL, null=True) |
| namespace = ForeignKey(Namespace, on_delete=SET_NULL, null=True, db_index=True) |
| |
| timestamp = BigIntegerField(db_index=True) |
| msgBacklog = BigIntegerField(default=0) |
| msgRateExpired = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgRateOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgRateRedeliver = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgThroughputOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| |
| SUBSCRIPTION_TYPES = ( |
| ('N', 'Not connected'), |
| ('E', 'Exclusive'), |
| ('S', 'Shared'), |
| ('F', 'Failover'), |
| ) |
| subscriptionType = CharField(max_length=1, choices=SUBSCRIPTION_TYPES, default='N') |
| unackedMessages = BigIntegerField(default=0) |
| |
| def __str__(self): |
| return self.name |
| |
| |
| class Consumer(Model): |
| timestamp = BigIntegerField(db_index=True) |
| subscription = ForeignKey(Subscription, on_delete=SET_NULL, db_index=True, null=True) |
| |
| address = CharField(max_length=64, null=True) |
| availablePermits = IntegerField(default=0) |
| connectedSince = DateTimeField(null=True) |
| consumerName = CharField(max_length=64, null=True) |
| msgRateOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgRateRedeliver = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| msgThroughputOut = DecimalField(max_digits = 12, decimal_places=1, default=0) |
| unackedMessages = BigIntegerField(default=0) |
| blockedConsumerOnUnackedMsgs = BooleanField(default=False) |
| |
| |
| class Replication(Model): |
| timestamp = BigIntegerField(db_index=True) |
| topic = ForeignKey(Topic, on_delete=SET_NULL, null=True) |
| local_cluster = ForeignKey(Cluster, on_delete=SET_NULL, null=True) |
| remote_cluster = ForeignKey(Cluster, on_delete=SET_NULL, null=True, related_name='remote_cluster') |
| |
| msgRateIn = DecimalField(max_digits = 12, decimal_places=1) |
| msgThroughputIn = DecimalField(max_digits = 12, decimal_places=1) |
| msgRateOut = DecimalField(max_digits = 12, decimal_places=1) |
| msgThroughputOut = DecimalField(max_digits = 12, decimal_places=1) |
| msgRateExpired = DecimalField(max_digits = 12, decimal_places=1) |
| replicationBacklog = BigIntegerField(default=0) |
| |
| connected = BooleanField(default=False) |
| replicationDelayInSeconds = IntegerField(default=0) |
| |
| inboundConnectedSince = DateTimeField(null=True) |
| outboundConnectedSince = DateTimeField(null=True) |