新钛云服已累计为您分享802篇技术干货
在前一篇公众号文章 《DuckDB 是什么及适用场景》中,原文链接为:,我们介绍了 DuckDB 是什么及其适用场景,接下来就以一个实际的例子进行演示,验证一下 DuckDB 是不是真的很香。
今天要探讨的这个例子就是如何使用 DuckDB 对云上的资源进行降本增效。既然要进行降本增效,那么我们就要用一定的方法论来指导我们的工作。
01
我们的方法论
评估和优化云资源使用
分析现有云资源的使用情况,包括实例类型、存储使用量、网络带宽等
根据业务需求,评估并优化云资源的使用效率,避免资源浪费
定期进行云资源审计,确保资源的合理分配和使用
选择合适的云服务商和定价模型
对比不同云服务商的性能、价格、服务质量等因素
根据业务需求选择合适的定价模型,如按需付费、预留实例、节省计划等
密切关注云服务商的优惠活动,合理利用优惠政策降低成本
实施自动化和智能化管理
使用自动化工具和技术,如自动化部署、监控和告警等,提高云资源管理的效率
利用 AI 和机器学习技术,实现云资源的智能调度和优化
自动化处理云资源的生命周期,包括创建、扩缩容、终止等
精简应用架构和减少资源依赖
评估现有应用架构的合理性,精简不必要的组件和服务
减少对外部资源和服务的依赖,降低潜在的成本和风险
优化应用性能,提高资源利用率
推广云原生技术和容器化部署
引入云原生技术和容器化部署方案,提高应用的可移植性和弹性
利用容器编排工具,实现资源的自动分配和调度
简化应用部署和运维流程,降低维护成本
加强安全防护和风险管理
建立健全的安全防护体系,保障云资源的安全性和稳定性
定期进行安全漏洞扫描和风险评估,及时修复潜在的安全隐患
加强员工的安全意识和培训,降低人为风险
建立成本效益评估机制
定期对云资源使用的成本效益进行评估
分析成本结构,找出成本控制的关键点
根据评估结果调整云资源管理策略,实现持续优化
02
以往是怎么做的
接下来我们介绍一下之前是怎么做的。不写文字了,放一个思维导图吧:
03
现在是怎么做的
接下来就以一种全新的方法来处理,思维导图如下:
准备数据
从 Grafana 的 Dashboard 上面下载监控数据,格式使用 CSV 及 JSON 都可以,我这里使用的是 CSV 格式。
操作过程就省略了,下载完毕,我们的当前目录下面会有两个文件:
➜ 降本增效 wc -l 20240627_cpu.csv 20240627_mem.csv
299 20240627_cpu.csv
293 20240627_mem.csv
592 total
下载下来的 CSV 文件中有些字段是中文的,需要调整成为对应的英文,过程就省略了。
主角登场
既然原始数据有了,接下来就唤出我们的主角:DuckDB。创建一个名为 costsaving.db 的数据库,我们需要把数据保留一段时间(因为分析是需要时间的)。
(venv311) ➜ 降本增效 duckdb costsaving.db
v1.0.0 1f98600c2c
Enter ".help" for usage hints.
-- 查看一下当前的数据库
D .databases
costsaving: costsaving.db
-- 查看一下当前的表
D .tables
导入数据
有了一个库之后,接下来我们就在这个库里面创建几张表:
-- 查看一下本地的 CSV 文件里面的字段情况
D DESCRIBE table './20240627_cpu.csv';
┌─────────────────────────────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │ null │ key │ default │ extra │
│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │
├─────────────────────────────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ Time │ TIMESTAMP │ YES │ │ │ │
│ __name__ │ VARCHAR │ YES │ │ │ │
│ hostname │ VARCHAR │ YES │ │ │ │
│ instance_id │ VARCHAR │ YES │ │ │ │
│ ipgroup │ VARCHAR │ YES │ │ │ │
│ zone_name │ VARCHAR │ YES │ │ │ │
│ rmgroup_id │ VARCHAR │ YES │ │ │ │
│ rmgroup_name │ VARCHAR │ YES │ │ │ │
......
......
......
│ tag_name │ VARCHAR │ YES │ │ │ │
│ percent │ VARCHAR │ YES │ │ │ │
├─────────────────────────────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┤
│ 21 rows 6 columns │
└───────────────────────────────────────────────────────────────────────────────────────────┘
D SELECT * from './20240627_cpu.csv';
┌──────────────────────┬──────────────────────┬──────────────────────┬───┬──────────────────────┬──────────────────────┬─────────┐
│ Time │ __name__ │ hostname │ … │ tag_ccc_security_d… │ tag_name │ percent │
│ timestamp │ varchar │ varchar │ │ varchar │ varchar │ varchar │
├──────────────────────┼──────────────────────┼──────────────────────┼───┼──────────────────────┼──────────────────────┼─────────┤
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ 53.2% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ 37.6% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-cccccc-yyy-001-… │ … │ │ │ 36.9% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-xx-xxx-uip… │ … │ │ │ 34.4% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ 34.2% │
│ · │ · │ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │ · │ · │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-staging-ddddddd… │ … │ │ │ 0.212% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-qa-zzzzzz-002 │ … │ │ │ 0.196% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-qa-bbbb-manage-… │ … │ │ │ 0.169% │
├──────────────────────┴──────────────────────┴──────────────────────┴───┴──────────────────────┴──────────────────────┴─────────┤
│ 298 rows (40 shown) 21 columns (6 shown) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
基础数据没有问题,接着我们就在 DuckDB 里面创建若干表,并把数据导入进来即可。操作如下:
D SELECT COUNT(*) FROM './20240627_cpu.csv';
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 298 │
└──────────────┘
确认非生产环境有多少台机器:
D SELECT COUNT(*) FROM './20240627_cpu.csv' WHERE hostname NOT ILIKE '%prod%';
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 178 │
└──────────────┘
确认生产环境有多少台机器:
D SELECT COUNT(*) FROM './20240627_cpu.csv' WHERE hostname ILIKE '%prod%';
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 120 │
└──────────────┘
非生产 178 + 生产 120 = 共 298 台,数量完全吻合,那么我们进行下一步。接着创建 4 张表:
-- 分别创建测试及生产环境的 CPU 使用信息表
D CREATE TABLE nonprod_cpu AS FROM './20240627_cpu.csv' WHERE hostname NOT ILIKE '%prod%';
D CREATE TABLE prod_cpu AS FROM './20240627_cpu.csv' WHERE hostname ILIKE '%prod%';
-- 分别创建测试及生产环境的 MEM 使用信息表
D CREATE TABLE prod_mem AS FROM './20240627_mem.csv' WHERE hostname ILIKE '%prod%';
D CREATE TABLE nonprod_mem AS FROM './20240627_mem.csv' WHERE hostname NOT ILIKE '%prod%';
创建完成,验证一下:
D .tables
nonprod_cpu nonprod_mem prod_cpu prod_mem
验证数据
验证一下数据是否正确:
D FROM nonprod_cpu LIMIT 10;
┌──────────────────────┬──────────────────────┬──────────────────────┬───┬──────────────────────┬──────────────────────┬──────────┬─────────┐
│ Time │ __name__ │ hostname │ … │ tag_ccc_security_c… │ tag_ccc_security_d… │ tag_name │ percent │
│ timestamp │ varchar │ varchar │ │ varchar │ varchar │ varchar │ varchar │
├──────────────────────┼──────────────────────┼──────────────────────┼───┼──────────────────────┼──────────────────────┼──────────┼─────────┤
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ │ 53.2% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ │ 37.6% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-cccccc-yyy-001-… │ … │ │ │ │ 36.9% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ │ 34.2% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-cccccc-yyy-001-… │ … │ │ │ │ 31.6% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ │ 30.4% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-cccccc-yyy-001-… │ … │ │ │ │ 25.2% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-qa-eeee-0002 │ … │ │ │ │ 24.7% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-cccccc-yyy-001-… │ … │ │ │ │ 24.5% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-xxxxxxxxxxxx-ac… │ … │ │ │ │ 22.9% │
├──────────────────────┴──────────────────────┴──────────────────────┴───┴──────────────────────┴──────────────────────┴──────────┴─────────┤
│ 10 rows 21 columns (7 shown) │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
D FROM prod_cpu LIMIT 10;
┌──────────────────────┬──────────────────────┬──────────────────────┬───┬──────────────────────┬──────────────────────┬──────────┬─────────┐
│ Time │ __name__ │ hostname │ … │ tag_ccc_security_c… │ tag_ccc_security_d… │ tag_name │ percent │
│ timestamp │ varchar │ varchar │ │ varchar │ varchar │ varchar │ varchar │
├──────────────────────┼──────────────────────┼──────────────────────┼───┼──────────────────────┼──────────────────────┼──────────┼─────────┤
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-xx-xxx-uip… │ … │ │ │ │ 34.4% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-zzzzzz-Ent… │ … │ │ │ │ 19.8% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-zzzzzz-Ind… │ … │ │ │ │ 17.9% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-zzzzzz-Ind… │ … │ │ │ │ 15.2% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-zzzzzz-Ind… │ … │ │ │ │ 14.9% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-yyy001-wor… │ … │ │ │ │ 12.9% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-aaaaa-exp… │ … │ │ │ │ 12.6% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-zzzzzz-Sea… │ … │ │ │ │ 12.1% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-fff-server… │ … │ │ │ │ 12.0% │
│ 2024-06-27 14:16:5… │ AliyunEcs_CPUUtili… │ yy-prod-ccccccc-se… │ … │ │ │ │ 11.7% │
├──────────────────────┴──────────────────────┴──────────────────────┴───┴──────────────────────┴──────────────────────┴──────────┴─────────┤
│ 10 rows 21 columns (7 shown) │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
类型转换
percent 字段是 varchar 类型的,我们需要把它转换成数字。
D ALTER TABLE prod_cpu
ALTER percent
TYPE NUMERIC
USING REPLACE(percent, '%', '')::NUMERIC(5,3);
开始查询
查看一下非生产环境的 CPU 低于 40% 使用率的 ECS,
D SELECT hostname, instance_id, percent FROM nonprod_cpu WHERE percent < '40' ORDER BY hostname;
┌─────────────────────────────────────────────┬─────────────────────────┬───────────────┐
│ hostname │ instance_id │ percent │
│ varchar │ varchar │ decimal(18,3) │
├─────────────────────────────────────────────┼─────────────────────────┼───────────────┤
│ yy-staging-aaaaaaaa-bbbbbb-bff-server-01002 │ e-abc33abcdefghijklmno │ 0.314 │
│ yy-qa-aaaaaaaa-big3-Server-0001 │ e-abcimabcdefghijklmno │ 2.590 │
│ yy-qa-aaaaaaaa-bbbbbb-bff-server-0001 │ e-abc5babcdefghijklmno │ 1.710 │
│ yy-staging-aaaaaaaa-big3-Server-01001 │ e-abc2rabcdefghijklmno │ 3.100 │
│ · │ · │ · │
│ · │ · │ · │
│ · │ · │ · │
│ yy-staging-ddddddd-bastion-02 │ e-abc8zyxwvuabcdefghij │ 0.715 │
│ yy-staging-aaa-bbbbbbbbbb-01 │ e-abc9zyxwvuabcdefghij │ 0.250 │
├─────────────────────────────────────────────┴─────────────────────────┴───────────────┤
│ 177 rows (40 shown) 3 columns │
└───────────────────────────────────────────────────────────────────────────────────────┘
查看生产环境的 CPU 低于 30% 使用率的 ECS:
D SELECT hostname, instance_id, percent FROM prod_cpu WHERE percent < '30' ORDER BY hostname;
┌──────────────────────────────────────────────────────────┬────────────────────────┬───────────────┐
│ hostname │ instance_id │ percent │
│ varchar │ varchar │ decimal(18,3) │
├──────────────────────────────────────────────────────────┼────────────────────────┼───────────────┤
│ yy-Prod-aaaaaaaa-big3-Server-001 │ e-abccabcdefghijklmnop │ 8.310 │
│ yy-Prod-aaaaaaaa-big3-Server-002 │ e-abc8abcdefghijklmnop │ 4.750 │
│ yy-Prod-aaaaaaaa-bbbbbb-bff-server-001 │ e-abc0abcdefghijklmnop │ 6.980 │
│ yy-Prod-aaaaaaaa-bbbbbb-bff-server-002 │ e-abcaabcdefghijklmnop │ 3.830 │
│ · │ · │ · │
│ · │ · │ · │
│ · │ · │ · │
│ yy-prod-awesome-yyyyyyyy-WAS-0001 │ e-abcqrstuvwxyzabcdefg │ 2.200 │
│ yy-prod-awesome-yyyyyyyy-WAS-0002 │ e-abcqrstuvwxyzabcdefg │ 2.260 │
├──────────────────────────────────────────────────────────┴────────────────────────┴───────────────┤
│ 119 rows (40 shown) 3 columns │
└───────────────────────────────────────────────────────────────────────────────────────────────────┘
单独查看 CPU 及 MEM 的意义不大,因此我们要进行关联查询,找出 MEM 及 CPU 都小于 40% 的实例。接下来我们就使用一个简单的关联查询。
关联查询
D SELECT
c.hostname,
c.percent AS cpu_percent,
m.percent AS mem_percent
FROM
nonprod_cpu c
LEFT JOIN nonprod_mem m ON c.hostname = m.hostname
WHERE
c."percent" < 40
AND m."percent" < 40
ORDER BY
c.hostname;
┌─────────────────────────────────────────────┬───────────────┬───────────────┐
│ hostname │ cpu_percent │ mem_percent │
│ varchar │ decimal(18,3) │ decimal(18,3) │
├─────────────────────────────────────────────┼───────────────┼───────────────┤
│ yy-staging-aaaaaaaa-bbbbbb-bff-server-01002 │ 0.314 │ 10.100 │
│ yy-qa-aaaaaaaa-bbbbbb-bff-server-0001 │ 1.710 │ 28.000 │
│ · │ · │ · │
│ · │ · │ · │
│ · │ · │ · │
│ yy-staging-ddddddd-bastion-02 │ 0.715 │ 22.500 │
│ yy-staging-awesome-yyyyyy-01 │ 0.250 │ 4.810 │
├─────────────────────────────────────────────┴───────────────┴───────────────┤
│ 84 rows (40 shown) 3 columns │
└─────────────────────────────────────────────────────────────────────────────┘
-- 或者 ORDER BY 1
D SELECT
c.hostname,
c.percent AS cpu_percent,
m.percent AS mem_percent
FROM
nonprod_cpu c
LEFT JOIN nonprod_mem m ON c.hostname = m.hostname
WHERE
c."percent" < 40
AND m."percent" < 40
ORDER BY 1;
最终结果
跳板机不做降本处理,因此,我们需要把跳板机的机器排除掉:
SELECT
c.hostname,
c.instance_id,
c.percent AS cpu_percent,
m.percent AS mem_percent,
c.tag_application_name as bff_name
FROM
nonprod_cpu c
LEFT JOIN nonprod_mem m ON c.hostname = m.hostname
WHERE
c. "percent" < 40
AND m. "percent" < 40
AND bff_name NOT NULL
AND bff_name <> 'bastion'
ORDER BY
bff_name;
+--------------------------------------------------+------------------------+-------------+-------------+---------------------------------+
| hostname | instance_id | cpu_percent | mem_percent | bff_name |
+--------------------------------------------------+------------------------+-------------+-------------+---------------------------------+
| yy-qa-bbbbbbbbbb-aaaaa-aaaaaaaaaaaaa-vvv-v2-0001 | e-abcabdefghxyzopcbacd | 0.877 | 19.100 | Awesome Project XX |
| yy-staging-ddddddd-00099 | e-abcabdefghxyzopcbacd | 0.212 | 4.970 | Awesome xx |
| yy-staging-ddddddd-00100 | e-abcabdefghxyzopcbacd | 1.700 | 19.400 | Awesome YY |
......
......
......
| yy-staging-awesome-xxxxxxxx-001 | e-abcopqrstuvwxyzabc12 | 3.830 | 28.100 | Awesome YYYYYYYY |
| yy-staging-awesome1-images-001 | e-abcopqrstuvwxyzabc12 | 1.190 | 26.900 | Awesome YYYYYYYY |
| yy-staging-awesome-xxxxxxxx-002 | e-abcopqrstuvwxyzabc12 | 1.980 | 25.900 | Awesome YYYYYYYY |
| yy-qa-awesome-win-01 | e-abcopqrstuvwxyzabc12 | 1.200 | 22.600 | awesome XX |
| yy-qa-awesome-client-02 | e-abcopqrstuvwxyzabc12 | 4.730 | 36.100 | awesome XX |
+--------------------------------------------------+------------------------+-------------+-------------+---------------------------------+
现在数据已经梳理完成,接下来就可以按照业务组(以应用名进行分组)分批进行降本了。
[!TIP] 如果要使用 Excel 进行上述分析,大概需要多久呢?是否可以做到两个或多个 Sheet 的关联呢?
各个击破
那么接下来的任务就是按应用为维度进行各个击破:
发邮件给相关的 PM 进行沟通及获取审批
审批之后,DevOps 团队开始对资源进行降本
测试环境可以随时进行,生产环境需要排期进行
好的,现在就去发邮件。因为模板都具有通用性,因此每个业务都可以复用。那么我们的邮件模板如下:
MAIL_TITLE: 申请测试环境 {BUSINESS_NAME} 业务的 ECS 降配
Hi {PM_NAME},
近期 DevOps 团队监控到 {BUSSINESS_NAME} 业务的 ECS 在最近 7 天的使用率
比较低(CPU 及 MEM 均低于 40%)。因此,根据降本增效原则申请降配,以实现
更为高效的资源利用和更为经济的运行方式。
涉及到的降配资源信息如下:
{RESOURCE_LIST}
因此,申请上述资源的降配,由原来的规格进行减半。如果后续需要进行压测,
届时再按要求进行资源的升配。还请审批,谢谢。
如有任何问题还请及时沟通,再次感谢。
有了邮件模板后,接下来的问题就是如何把相关的数据渲染到模板中。方法有很多,我这里使用了 BASH 脚本来生成邮件模板。脚本如下:
#!/bin/bash
declare -A PM_PROJECT_MAPPING_LIST
PM_PROJECT_MAPPING_LIST=(
["Lebron_James"]="Awesome Project XXXXX"
["Dwyane_Wade"]="Awesome Project AAAAA"
["Chris_Bosh"]="Awesome Project CCCCC"
)
for PM in "${!PM_PROJECT_MAPPING_LIST[@]}"; do
echo "MAIL_TITLE: 申请测试环境 ${PM_PROJECT_MAPPING_LIST[$PM]} 业务的 ECS 降配"
echo
echo "Hi `echo "${PM}" |cut -d'_' -f1`,"
echo
echo "近期 DevOps 团队监控到「${PM_PROJECT_MAPPING_LIST[$PM]}」业务的 ECS 在最近 7 天的使用率"
echo
echo "比较低(**CPU及 MEM 均低于 40%**)。因此,根据降本增效原则申请降配,以实现"
echo
echo "更为高效的资源利用和更为经济的运行方式。"
echo
echo "涉及到的降配资源信息如下:"
echo
duckdb -markdown -s "SELECT c.hostname, c.instance_id, c.percent AS cpu_percent, m.percent AS mem_percent, c.tag_application_name as app_name FROM nonprod_cpu c LEFT JOIN nonprod_mem m ON c.hostname = m.hostname WHERE c."percent" < 40 AND m."percent" < 40 AND app_name='${PM_PROJECT_MAPPING_LIST[$PM]}' AND app_name <> 'bastion' ORDER BY app_name;" costsaving.db
echo
echo "因此,**申请上述资源的降配,由原来的规格进行减半**。如果后续需要进行压测,"
echo
echo "届时再按要求进行资源的升配。还请审批,谢谢。"
echo
echo "如有任何问题还请及时沟通,再次感谢。"
echo
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo
done
执行结果如下:
[root@mymssql01 ~]# sh generate_email.sh
MAIL_TITLE: 申请测试环境 Awesome Project XXXXX 业务的 ECS 降配
Hi Lebron,
近期 DevOps 团队监控到「Awesome Project XXXXX」业务的 ECS 在最近 7 天的使用率
比较低(**CPU及 MEM 均低于 40%**)。因此,根据降本增效原则申请降配,以实现
更为高效的资源利用和更为经济的运行方式。
涉及到的降配资源信息如下:
| hostname | instance_id | cpu_percent | mem_percent | app_name |
|-----------------------------------|------------------------|------------:|------------:|-----------------------|
| yy-qa-aaaaaa-bbbbbbb-web-001 | e-aaaabcdefghijklmnopq | 2.400 | 30.300 | Awesome Project XXXXX |
| yy-qa-aaaaaa-bbbbbbb-web-002 | e-aaaabcdefghijklmnopq | 2.330 | 29.800 | Awesome Project XXXXX |
| yy-staging-aaaaaa-bbbbbbb-web-001 | e-aaaabcdefghijklmnopq | 2.750 | 24.100 | Awesome Project XXXXX |
| yy-staging-aaaaaa-bbbbbbb-web-002 | e-aaaabcdefghijklmnopq | 1.010 | 13.300 | Awesome Project XXXXX |
因此,**申请上述资源的降配,由原来的规格进行减半**。如果后续需要进行压测,
届时再按要求进行资源的升配。还请审批,谢谢。
如有任何问题还请及时沟通,再次感谢。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
生成的邮件模板是 Markdown 格式,因此,那么剩下的工作就是用鼠标粘贴复制到邮件中了。粘贴到邮件中的效果如下:
如果连鼠标也不想用,可以在脚本里面发邮件;如果连脚本都不想执行,是不是可以集成到一个平台上呢?方法及思路有很多。
04
总结
从有了想法开始到实现以及整个文档的初步编写,整个过程花了半天时间。所以,新的分析方式的效率是非常高的,这多亏了 DuckDB。但 DuckDB 所能提供的远不止这些,后续关于 DuckDB 更多有趣及好玩的场景,我们再做分享,谢谢大家。
如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。
热门跟贴