Skip to content

Commit f5d4e87

Browse files
v_ycggyaoiSecloud
authored andcommitted
feat(backend): redis即时内存分析【saas部分】 #14359
1 parent 774bc52 commit f5d4e87

File tree

11 files changed

+589
-126
lines changed

11 files changed

+589
-126
lines changed

dbm-ui/backend/db_services/redis/redis_keystat_report/filters.py

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,88 @@
88
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
99
specific language governing permissions and limitations under the License.
1010
"""
11+
from django.db.models import Q
12+
from django.utils.translation import gettext_lazy as _
13+
from django_filters import rest_framework as filters
1114

12-
# 定义内存分析统计报告过滤器
15+
from backend.db_services.redis.redis_keystat_report.models import RankItem, ReportItem, ReportRecord
16+
17+
18+
class KeyStatReportRecordFilter(filters.FilterSet):
19+
record_id = filters.NumberFilter(field_name="record_id", label=_("过滤key类型"))
20+
ticket_id = filters.NumberFilter(field_name="ticket_id", label=_("过滤关联单据"))
21+
operator = filters.CharFilter(field_name="creator", lookup_expr="icontains", label=_("操作者"))
22+
ordering = filters.CharFilter(field_name="ordering", method="order_keystat", label=_("排序字段"))
23+
create_at__lte = filters.DateTimeFilter(field_name="create_at", lookup_expr="lte", label=_("创建时间早于"))
24+
create_at__gte = filters.DateTimeFilter(field_name="create_at", lookup_expr="gte", label=_("创建时间晚于"))
25+
instance_addresses = filters.CharFilter(
26+
field_name="ins_list", method="filter_instance_addresses", label=_("过滤IP/实例")
27+
)
28+
immute_domain = filters.CharFilter(field_name="immute_domain", method="filter_immute_domain", label=_("过滤域名"))
29+
cluster_ids = filters.CharFilter(field_name="cluster_id", method="filter_cluster_ids", label=_("过滤集群"))
30+
status = filters.CharFilter(field_name="status", lookup_expr="exact", label=_("任务状态"))
31+
32+
def filter_instance_addresses(self, queryset, name, value):
33+
query_filters = Q()
34+
if value:
35+
instance_filters = Q()
36+
instances = value.split(",")
37+
for instance in instances:
38+
instance_filters |= Q(source_addr_list__icontains=instance)
39+
query_filters &= instance_filters
40+
return queryset.filter(query_filters)
41+
42+
def filter_cluster_ids(self, queryset, name, value):
43+
return queryset.filter(cluster_id__in=value.split(","))
44+
45+
def filter_immute_domain(self, queryset, name, value):
46+
return queryset.filter(immute_domain__in=value.split(","))
47+
48+
def order_keystat(self, queryset, name, value):
49+
return queryset.order_by(value)
50+
51+
class Meta:
52+
model = ReportRecord
53+
fields = [
54+
"record_id",
55+
"ticket_id",
56+
"operator",
57+
"cluster_ids",
58+
"create_at__lte",
59+
"create_at__gte",
60+
"immute_domain",
61+
"instance_addresses",
62+
"status",
63+
]
64+
65+
66+
class KeyStatRecordDetailFilter(filters.FilterSet):
67+
key_type = filters.CharFilter(field_name="key_type", method="filter_key_type", label=_("过滤key类型"))
68+
key_class = filters.CharFilter(field_name="key_class", lookup_expr="icontains", label=_("过滤key模式"))
69+
ordering = filters.CharFilter(field_name="ordering", method="order_keystat", label=_("排序字段"))
70+
71+
class Meta:
72+
model = ReportItem
73+
fields = ["key_type", "key_class"]
74+
75+
def filter_key_type(self, queryset, name, value):
76+
return queryset.filter(key_type__in=value.split(","))
77+
78+
def order_keystat(self, queryset, name, value):
79+
return queryset.order_by(value)
80+
81+
82+
class RankItemDetailFilter(filters.FilterSet):
83+
key_type = filters.CharFilter(field_name="key_type", method="filter_key_type", label=_("过滤key类型"))
84+
key_name = filters.CharFilter(field_name="key_name", lookup_expr="icontains", label=_("过滤key样本"))
85+
ordering = filters.CharFilter(field_name="ordering", method="order_keystat", label=_("排序字段"))
86+
87+
def filter_key_type(self, queryset, name, value):
88+
return queryset.filter(key_type__in=value.split(","))
89+
90+
def order_keystat(self, queryset, name, value):
91+
return queryset.order_by(value)
92+
93+
class Meta:
94+
model = RankItem
95+
fields = ["key_type", "key_name"]
Lines changed: 73 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# Generated by Django 3.2.25 on 2025-10-23 01:57
1+
# Generated by Django 4.2.23 on 2025-11-20 07:40
22

33
from django.db import migrations, models
44

5-
import backend.flow.consts
65
from backend.db_meta.enums import ClusterType
6+
from backend.flow.consts import StateType
77

88

99
class Migration(migrations.Migration):
@@ -13,75 +13,14 @@ class Migration(migrations.Migration):
1313
dependencies = []
1414

1515
operations = [
16-
migrations.CreateModel(
17-
name="RankItem",
18-
fields=[
19-
("id", models.AutoField(help_text="主键id", primary_key=True, serialize=False)),
20-
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
21-
("record_id", models.BigIntegerField(default=0, help_text="关联的记录id")),
22-
("key_name", models.CharField(default="", help_text="key名称", max_length=255)),
23-
("key_type", models.CharField(default="", help_text="key类型", max_length=255)),
24-
("rank_value", models.IntegerField(default=0, help_text="排行值")),
25-
("ttl", models.IntegerField(default=0, help_text="TTL")),
26-
("atime", models.IntegerField(default=0, help_text="最后访问时间")),
27-
("member", models.IntegerField(default=0, help_text="成员的数量")),
28-
("member_len", models.IntegerField(default=0, help_text="成员的平均长度")),
29-
("value_size", models.IntegerField(default=0, help_text="value的长度或者成员value的长度")),
30-
("db", models.IntegerField(default=0, help_text="db")),
31-
("memory_size", models.IntegerField(default=0, help_text="基础内存占用, 复合类型中是采样计算结果")),
32-
],
33-
options={
34-
"verbose_name": "内存分析统计排行详情表",
35-
"verbose_name_plural": "内存分析统计排行详情表",
36-
},
37-
),
38-
migrations.CreateModel(
39-
name="ReportItem",
40-
fields=[
41-
("id", models.AutoField(help_text="主键id", primary_key=True, serialize=False)),
42-
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
43-
("record_id", models.BigIntegerField(default=0, help_text="关联的记录id")),
44-
("key_name", models.CharField(default="", help_text="key名称", max_length=255)),
45-
("key_type", models.CharField(default="", help_text="key类型", max_length=255)),
46-
("key_class", models.CharField(default="", help_text="key分类", max_length=255)),
47-
("count", models.IntegerField(default=0, help_text="数量")),
48-
("count_with_ttl", models.IntegerField(default=0, help_text="带TTL的数量")),
49-
("member_max_count", models.IntegerField(default=0, help_text="成员最大数量")),
50-
("avg_ttl", models.IntegerField(default=0, help_text="平均TTL")),
51-
("avg_ttl_human", models.CharField(default="", help_text="平均TTL人类化描述", max_length=255)),
52-
("min_idletime_human", models.CharField(default="", help_text="最小空闲时间人类化描述", max_length=255)),
53-
("so_min_idletime_human", models.CharField(default="", help_text="最小空闲时间人类化描述ForSo", max_length=255)),
54-
("min_idletime", models.IntegerField(default=0, help_text="最小空闲时间")),
55-
("mem_used_bytes", models.IntegerField(default=0, help_text="内存使用量字节数")),
56-
("mem_used_pct", models.FloatField(default=0, help_text="内存使用量字节数占比", max_length=255)),
57-
],
58-
options={
59-
"verbose_name": "内存分析统计记录详情表",
60-
"verbose_name_plural": "内存分析统计记录详情表",
61-
},
62-
),
63-
migrations.CreateModel(
64-
name="ReportProgress",
65-
fields=[
66-
("id", models.BigIntegerField(default=0, help_text="主键id", primary_key=True, serialize=False)),
67-
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
68-
("record_id", models.BigIntegerField(default=0, help_text="关联的记录id")),
69-
("progress", models.CharField(default="", help_text="进度, 0-100", max_length=255)),
70-
("detail", models.JSONField(blank=True, default=dict, help_text="进度详情", null=True)),
71-
],
72-
options={
73-
"verbose_name": "内存分析统计进度记录表",
74-
"verbose_name_plural": "内存分析统计进度记录表",
75-
},
76-
),
7716
migrations.CreateModel(
7817
name="ReportRecord",
7918
fields=[
8019
("creator", models.CharField(max_length=64, verbose_name="创建人")),
8120
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
8221
("updater", models.CharField(max_length=64, verbose_name="修改人")),
8322
("update_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")),
84-
("record_id", models.BigIntegerField(default=0, help_text="主键id", primary_key=True, serialize=False)),
23+
("record_id", models.AutoField(help_text="主键id", primary_key=True, serialize=False)),
8524
("ticket_id", models.PositiveIntegerField(default=0, help_text="关联的单据id")),
8625
("root_id", models.CharField(default="", help_text="关联root_id", max_length=64)),
8726
("bk_biz_id", models.IntegerField(default=0, help_text="关联的业务id")),
@@ -107,19 +46,9 @@ class Migration(migrations.Migration):
10746
(
10847
"status",
10948
models.CharField(
110-
choices=[
111-
("CREATED", "创建态"),
112-
("READY", "准备态"),
113-
("RUNNING", "运行态"),
114-
("SUSPENDED", "暂停态"),
115-
("BLOCKED", "闭塞态"),
116-
("FINISHED", "完成态"),
117-
("FAILED", "失败态"),
118-
("REVOKED", "取消态"),
119-
("EXPIRED", "已过期"),
120-
],
121-
default=backend.flow.consts.StateType["CREATED"],
122-
help_text="报告状态",
49+
choices=StateType.get_choices(),
50+
default=StateType.READY,
51+
help_text="状态",
12352
max_length=64,
12453
),
12554
),
@@ -131,22 +60,76 @@ class Migration(migrations.Migration):
13160
options={
13261
"verbose_name": "内存分析统计记录表",
13362
"verbose_name_plural": "内存分析统计记录表",
63+
"indexes": [models.Index(fields=["bk_biz_id", "create_at"], name="redis_keyst_bk_biz__c53645_idx")],
13464
},
13565
),
136-
migrations.AddIndex(
137-
model_name="reportrecord",
138-
index=models.Index(fields=["bk_biz_id", "create_at"], name="redis_keyst_bk_biz__c53645_idx"),
139-
),
140-
migrations.AddIndex(
141-
model_name="reportprogress",
142-
index=models.Index(fields=["record_id"], name="redis_keyst_record__3cac24_idx"),
66+
migrations.CreateModel(
67+
name="ReportProgress",
68+
fields=[
69+
("id", models.AutoField(help_text="主键id", primary_key=True, serialize=False)),
70+
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
71+
("record_id", models.BigIntegerField(default=0, help_text="关联的记录id")),
72+
("progress", models.CharField(default="", help_text="进度, 0-100", max_length=255)),
73+
("detail", models.JSONField(blank=True, default=dict, help_text="进度详情", null=True)),
74+
],
75+
options={
76+
"verbose_name": "内存分析统计进度记录表",
77+
"verbose_name_plural": "内存分析统计进度记录表",
78+
"indexes": [models.Index(fields=["record_id"], name="redis_keyst_record__3cac24_idx")],
79+
},
14380
),
144-
migrations.AddIndex(
145-
model_name="reportitem",
146-
index=models.Index(fields=["record_id"], name="redis_keyst_record__6e262f_idx"),
81+
migrations.CreateModel(
82+
name="ReportItem",
83+
fields=[
84+
("id", models.AutoField(help_text="主键id", primary_key=True, serialize=False)),
85+
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
86+
("record_id", models.BigIntegerField(default=0, help_text="关联的记录id")),
87+
("key_name", models.CharField(default="", help_text="key名称", max_length=255)),
88+
("key_type", models.CharField(default="", help_text="key类型", max_length=255)),
89+
("key_class", models.CharField(default="", help_text="key分类", max_length=255)),
90+
("count", models.IntegerField(default=0, help_text="数量")),
91+
("count_with_ttl", models.IntegerField(default=0, help_text="带TTL的数量")),
92+
("member_max_count", models.IntegerField(default=0, help_text="成员最大数量")),
93+
("avg_key_length", models.IntegerField(default=0, help_text="平均成员数量")),
94+
("avg_ttl", models.IntegerField(default=0, help_text="平均TTL")),
95+
("avg_ttl_human", models.CharField(default="", help_text="平均TTL人类化描述", max_length=255)),
96+
("min_idletime_human", models.CharField(default="", help_text="最小空闲时间人类化描述", max_length=255)),
97+
("so_min_idletime_human", models.CharField(default="", help_text="最小空闲时间人类化描述ForSo", max_length=255)),
98+
("min_idletime", models.IntegerField(default=0, help_text="最小空闲时间")),
99+
("min_idletime_show", models.IntegerField(default=0, help_text="最近访问时间(带单位)")),
100+
("avg_key_used_bytes", models.IntegerField(default=0, help_text="单key平均占用内存")),
101+
("mem_used_bytes", models.IntegerField(default=0, help_text="内存使用量字节数")),
102+
("mem_used_pct", models.FloatField(default=0, help_text="内存使用量字节数占比", max_length=255)),
103+
],
104+
options={
105+
"verbose_name": "内存分析统计记录详情表",
106+
"verbose_name_plural": "内存分析统计记录详情表",
107+
"indexes": [models.Index(fields=["record_id"], name="redis_keyst_record__6e262f_idx")],
108+
},
147109
),
148-
migrations.AddIndex(
149-
model_name="rankitem",
150-
index=models.Index(fields=["record_id"], name="redis_keyst_record__43f67f_idx"),
110+
migrations.CreateModel(
111+
name="RankItem",
112+
fields=[
113+
("id", models.AutoField(help_text="主键id", primary_key=True, serialize=False)),
114+
("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
115+
("record_id", models.BigIntegerField(default=0, help_text="关联的记录id")),
116+
("key_name", models.CharField(default="", help_text="key名称", max_length=255)),
117+
("key_type", models.CharField(default="", help_text="key类型", max_length=255)),
118+
("rank_value", models.IntegerField(default=0, help_text="排行值")),
119+
("ttl", models.IntegerField(default=0, help_text="TTL")),
120+
("ttl_human", models.IntegerField(default=0, help_text="过期时间(带单位)")),
121+
("atime", models.IntegerField(default=0, help_text="最后访问时间")),
122+
("member", models.IntegerField(default=0, help_text="成员的数量")),
123+
("member_len", models.IntegerField(default=0, help_text="成员的平均长度")),
124+
("key_length", models.IntegerField(default=0, help_text="key的长度")),
125+
("value_size", models.IntegerField(default=0, help_text="value的长度或者成员value的长度")),
126+
("db", models.IntegerField(default=0, help_text="db")),
127+
("memory_size", models.IntegerField(default=0, help_text="基础内存占用, 复合类型中是采样计算结果")),
128+
],
129+
options={
130+
"verbose_name": "内存分析统计排行详情表",
131+
"verbose_name_plural": "内存分析统计排行详情表",
132+
"indexes": [models.Index(fields=["record_id"], name="redis_keyst_record__43f67f_idx")],
133+
},
151134
),
152135
]

0 commit comments

Comments
 (0)