如何使用DuckDB进行降本增效

500c8ff13ffff1517449ce81ee678749.gif

 新钛云服已累计为您分享802篇技术干货

cc53842bbd50dc298fd25ddd5e66573c.gif

在前一篇公众号文章 《DuckDB 是什么及适用场景》中,原文链接为:https://mp.weixin.qq.com/s/v7yJhoJkZVKcho4PjoQEhw,我们介绍了 DuckDB 是什么及其适用场景,接下来就以一个实际的例子进行演示,验证一下 DuckDB 是不是真的很香。

今天要探讨的这个例子就是如何使用 DuckDB 对云上的资源进行降本增效。既然要进行降本增效,那么我们就要用一定的方法论来指导我们的工作。

01

我们的方法论

评估和优化云资源使用

  • 分析现有云资源的使用情况,包括实例类型、存储使用量、网络带宽等

  • 根据业务需求,评估并优化云资源的使用效率,避免资源浪费

  • 定期进行云资源审计,确保资源的合理分配和使用

选择合适的云服务商和定价模型

  • 对比不同云服务商的性能、价格、服务质量等因素

  • 根据业务需求选择合适的定价模型,如按需付费、预留实例、节省计划等

  • 密切关注云服务商的优惠活动,合理利用优惠政策降低成本

实施自动化和智能化管理

  • 使用自动化工具和技术,如自动化部署、监控和告警等,提高云资源管理的效率

  • 利用 AI 和机器学习技术,实现云资源的智能调度和优化

  • 自动化处理云资源的生命周期,包括创建、扩缩容、终止等

精简应用架构和减少资源依赖

  • 评估现有应用架构的合理性,精简不必要的组件和服务

  • 减少对外部资源和服务的依赖,降低潜在的成本和风险

  • 优化应用性能,提高资源利用率

推广云原生技术和容器化部署

  • 引入云原生技术和容器化部署方案,提高应用的可移植性和弹性

  • 利用容器编排工具,实现资源的自动分配和调度

  • 简化应用部署和运维流程,降低维护成本

加强安全防护和风险管理

  • 建立健全的安全防护体系,保障云资源的安全性和稳定性

  • 定期进行安全漏洞扫描和风险评估,及时修复潜在的安全隐患

  • 加强员工的安全意识和培训,降低人为风险

建立成本效益评估机制

  • 定期对云资源使用的成本效益进行评估

  • 分析成本结构,找出成本控制的关键点

  • 根据评估结果调整云资源管理策略,实现持续优化

02

以往是怎么做的

接下来我们介绍一下之前是怎么做的。不写文字了,放一个思维导图吧:

31712b58b46182cb934cfc548725ac10.png

03

现在是怎么做的

接下来就以一种全新的方法来处理,思维导图如下:

3a6c97ee99060e11ae1d4b18853b39cc.png

准备数据

从 Grafana 的 Dashboard 上面下载监控数据,格式使用 CSV 及 JSON 都可以,我这里使用的是 CSV 格式。

0c6d11864a06307b6fd8ab29c8770ffd.png

操作过程就省略了,下载完毕,我们的当前目录下面会有两个文件:

➜  降本增效 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 的关联呢?


各个击破

那么接下来的任务就是按应用为维度进行各个击破:

  1. 发邮件给相关的 PM 进行沟通及获取审批

  2. 审批之后,DevOps 团队开始对资源进行降本

  3. 测试环境可以随时进行,生产环境需要排期进行

好的,现在就去发邮件。因为模板都具有通用性,因此每个业务都可以复用。那么我们的邮件模板如下:

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 格式,因此,那么剩下的工作就是用鼠标粘贴复制到邮件中了。粘贴到邮件中的效果如下:

6cc16985ec3b35adf6d49936f40d410b.png

如果连鼠标也不想用,可以在脚本里面发邮件;如果连脚本都不想执行,是不是可以集成到一个平台上呢?方法及思路有很多。

04

总结

从有了想法开始到实现以及整个文档的初步编写,整个过程花了半天时间。所以,新的分析方式的效率是非常高的,这多亏了 DuckDB。但 DuckDB 所能提供的远不止这些,后续关于 DuckDB 更多有趣及好玩的场景,我们再做分享,谢谢大家。

如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。

    推荐阅读   

0b7a6156004f0ef39b80f68d79380276.png

415909a0e09ae2efb9d6dc3d505f42ad.png

    推荐视频    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值