2018年9月

我是从 Linux 迁移过来的 FreeBSD 新用户,Linux 中使用的是 netfilter 防火墙框架(LCTT 译注:netfilter 是由 Rusty Russell 提出的 Linux 2.4 内核防火墙框架)。那么在 FreeBSD 上,我该如何设置 PF 防火墙,来保护只有一个公共 IP 地址和端口的 web 服务器呢?

PF 是 包过滤器 packet filter 的简称。它是为 OpenBSD 开发的,但是已经被移植到了 FreeBSD 以及其它操作系统上。PF 是一个包状态过滤引擎。在这篇教程中,我将向你展示如何在 FreeBSD 10.x 以及 11.x 中设置 PF 防火墙,从而来保护 web 服务器。

第一步:开启 PF 防火墙

你需要把下面这几行内容添加到文件 /etc/rc.conf 文件中:

# echo 'pf_enable="YES"' >> /etc/rc.conf
# echo 'pf_rules="/usr/local/etc/pf.conf"' >> /etc/rc.conf
# echo 'pflog_enable="YES"' >> /etc/rc.conf
# echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf

在这里:

  1. pf_enable="YES" - 开启 PF 服务
  2. pf_rules="/usr/local/etc/pf.conf" - 从文件 /usr/local/etc/pf.conf 中读取 PF 规则
  3. pflog_enable="YES" - 为 PF 服务打开日志支持
  4. pflog_logfile="/var/log/pflog" - 存储日志的文件,即日志存于文件 /var/log/pflog

第二步:在 /usr/local/etc/pf.conf 文件中创建防火墙规则

输入下面这个命令打开文件(超级用户模式下):

# vi /usr/local/etc/pf.conf

在文件中添加下面这些 PF 规则集:

# vim: set ft=pf
# /usr/local/etc/pf.conf
 
## 设置公共端口 ##
ext_if="vtnet0"
 
## 设置服务器公共 IP 地址 ##
ext_if_ip="172.xxx.yyy.zzz"
 
## 设置并删除下面这些公共端口上的 IP 范围 ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
          10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
          0.0.0.0/8, 240.0.0.0/4 }"
 
## 设置 http(80)/https (443) 端口 ##
webports = "{http, https}"
 
## 启用下面这些服务 ##
int_tcp_services = "{domain, ntp, smtp, www, https, ftp, ssh}"
int_udp_services = "{domain, ntp}"
 
## 跳过回环端口 - 跳过端口上的所有 PF 处理 ##
set skip on lo
 
## 设置 PF 应该统计的端口信息,如发送/接收字节数,通过/禁止的包的数目 ##
set loginterface $ext_if
 
## 设置默认策略 ##
block return in log all
block out all
 
# 基于 IP 分片的错误处理来防御攻击 
scrub in all
 
# 删除所有不可达路由地址
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians
 
## 禁止欺骗包
antispoof quick for $ext_if
 
# 打开 SSH 端口,SSH 服务仅从 VPN IP 139.xx.yy.zz 监听 22 号端口
# 出于安全原因,我不允许/接收 SSH 流量
pass in quick on $ext_if inet proto tcp from 139.xxx.yyy.zzz to $ext_if_ip port = ssh flags S/SA keep state label "USER_RULE: Allow SSH from 139.xxx.yyy.zzz"
## 使用下面这些规则来为所有来自任何 IP 地址的用户开启 SSH 服务 #
## pass in inet proto tcp to $ext_if port ssh
### [ OR ] ###
## pass in inet proto tcp to $ext_if port 22 
 
# Allow Ping-Pong stuff. Be a good sysadmin 
pass inet proto icmp icmp-type echoreq
 
# All access to our Nginx/Apache/Lighttpd Webserver ports 
pass proto tcp from any to $ext_if port $webports
 
# 允许重要的发送流量
pass out quick on $ext_if proto tcp to any port $int_tcp_services
pass out quick on $ext_if proto udp to any port $int_udp_services
 
# 在下面添加自定义规则

保存并关闭文件。欢迎来参考我的规则集。如果要检查语法错误,可以运行:

# service pf check

/etc/rc.d/pf check

# pfctl -n -f /usr/local/etc/pf.conf

第三步:开始运行 PF 防火墙

命令如下。请小心,如果是基于 SSH 的会话,你可能会和服务器断开连接。

开启 PF 防火墙:

# service pf start

停用 PF 防火墙:

# service pf stop

检查语法错误:

# service pf check

重启服务:

# service pf restart

查看 PF 状态:

# service pf status

示例输出:

Status: Enabled for 0 days 00:02:18           Debug: Urgent
 
Interface Stats for vtnet0            IPv4             IPv6
  Bytes In                           19463                0
  Bytes Out                          18541                0
  Packets In
    Passed                             244                0
    Blocked                              3                0
  Packets Out
    Passed                             136                0
    Blocked                             12                0
 
State Table                          Total             Rate
  current entries                        1               
  searches                             395            2.9/s
  inserts                                4            0.0/s
  removals                               3            0.0/s
Counters
  match                                 19            0.1/s
  bad-offset                             0            0.0/s
  fragment                               0            0.0/s
  short                                  0            0.0/s
  normalize                              0            0.0/s
  memory                                 0            0.0/s
  bad-timestamp                          0            0.0/s
  congestion                             0            0.0/s
  ip-option                              0            0.0/s
  proto-cksum                            0            0.0/s
  state-mismatch                         0            0.0/s
  state-insert                           0            0.0/s
  state-limit                            0            0.0/s
  src-limit                              0            0.0/s
  synproxy                               0            0.0/s
  map-failed                             0            0.0/s

开启/关闭/重启 pflog 服务的命令

输入下面这些命令:

# service pflog start
# service pflog stop
# service pflog restart

第四步:pfctl 命令的简单介绍

你需要使用 pfctl 命令来查看 PF 规则集和参数配置,包括来自 包过滤器 packet filter 的状态信息。让我们来看一下所有常见命令:

显示 PF 规则信息

# pfctl -s rules

示例输出:

block return in log all
block drop out all
block drop in quick on ! vtnet0 inet from 172.xxx.yyy.zzz/24 to any
block drop in quick inet from 172.xxx.yyy.zzz/24 to any
pass in quick on vtnet0 inet proto tcp from 139.aaa.ccc.ddd to 172.xxx.yyy.zzz/24 port = ssh flags S/SA keep state label "USER_RULE: Allow SSH from 139.aaa.ccc.ddd"
pass inet proto icmp all icmp-type echoreq keep state
pass out quick on vtnet0 proto tcp from any to any port = domain flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = ntp flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = smtp flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = http flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = https flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = ftp flags S/SA keep state
pass out quick on vtnet0 proto tcp from any to any port = ssh flags S/SA keep state
pass out quick on vtnet0 proto udp from any to any port = domain keep state
pass out quick on vtnet0 proto udp from any to any port = ntp keep state

显示每条规则的详细内容

# pfctl -v -s rules

在每条规则的详细输出中添加规则编号:

# pfctl -vvsr show

显示状态信息

# pfctl -s state
# pfctl -s state | more
# pfctl -s state | grep 'something'

如何在命令行中禁止 PF 服务

# pfctl -d

如何在命令行中启用 PF 服务

# pfctl -e

如何在命令行中刷新 PF 规则/NAT/路由表

# pfctl -F all

示例输出:

rules cleared
nat cleared
0 tables deleted.
2 states cleared
source tracking entries cleared
pf: statistics cleared
pf: interface flags reset

如何在命令行中仅刷新 PF 规则

# pfctl -F rules

如何在命令行中仅刷新队列

# pfctl -F queue

如何在命令行中刷新统计信息(它不是任何规则的一部分)

# pfctl -F info

如何在命令行中清除所有计数器

# pfctl -z clear

第五步:查看 PF 日志

PF 日志是二进制格式的。使用下面这一命令来查看:

# tcpdump -n -e -ttt -r /var/log/pflog

示例输出:

Aug 29 15:41:11.757829 rule 0/(match) block in on vio0: 86.47.225.151.55806 > 45.FOO.BAR.IP.23: S 757158343:757158343(0) win 52206 [tos 0x28]
Aug 29 15:41:44.193309 rule 0/(match) block in on vio0: 5.196.83.88.25461 > 45.FOO.BAR.IP.26941: S 2224505792:2224505792(0) ack 4252565505 win 17520 (DF) [tos 0x24]
Aug 29 15:41:54.628027 rule 0/(match) block in on vio0: 45.55.13.94.50217 > 45.FOO.BAR.IP.465: S 3941123632:3941123632(0) win 65535
Aug 29 15:42:11.126427 rule 0/(match) block in on vio0: 87.250.224.127.59862 > 45.FOO.BAR.IP.80: S 248176545:248176545(0) win 28200 <mss 1410,sackOK,timestamp 1044055305 0,nop,wscale 8> (DF)
Aug 29 15:43:04.953537 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7475: S 1164335542:1164335542(0) win 1024
Aug 29 15:43:05.122156 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7475: R 1164335543:1164335543(0) win 1200
Aug 29 15:43:37.302410 rule 0/(match) block in on vio0: 94.130.12.27.18080 > 45.FOO.BAR.IP.64857: S 683904905:683904905(0) ack 4000841729 win 16384 <mss 1460>
Aug 29 15:44:46.574863 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7677: S 3451987887:3451987887(0) win 1024
Aug 29 15:44:46.819754 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.7677: R 3451987888:3451987888(0) win 1200
Aug 29 15:45:21.194752 rule 0/(match) block in on vio0: 185.40.4.130.55910 > 45.FOO.BAR.IP.80: S 3106068642:3106068642(0) win 1024
Aug 29 15:45:32.999219 rule 0/(match) block in on vio0: 185.40.4.130.55910 > 45.FOO.BAR.IP.808: S 322591763:322591763(0) win 1024
Aug 29 15:46:30.157884 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6511: S 2412580953:2412580953(0) win 1024 [tos 0x28]
Aug 29 15:46:30.252023 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6511: R 2412580954:2412580954(0) win 1200 [tos 0x28]
Aug 29 15:49:44.337015 rule 0/(match) block in on vio0: 189.219.226.213.22640 > 45.FOO.BAR.IP.23: S 14807:14807(0) win 14600 [tos 0x28]
Aug 29 15:49:55.161572 rule 0/(match) block in on vio0: 5.196.83.88.25461 > 45.FOO.BAR.IP.40321: S 1297217585:1297217585(0) ack 1051525121 win 17520 (DF) [tos 0x24]
Aug 29 15:49:59.735391 rule 0/(match) block in on vio0: 36.7.147.209.2545 > 45.FOO.BAR.IP.3389: SWE 3577047469:3577047469(0) win 8192 <mss 1460,nop,wscale 8,nop,nop,sackOK> (DF) [tos 0x2 (E)]
Aug 29 15:50:00.703229 rule 0/(match) block in on vio0: 36.7.147.209.2546 > 45.FOO.BAR.IP.3389: SWE 1539382950:1539382950(0) win 8192 <mss 1460,nop,wscale 8,nop,nop,sackOK> (DF) [tos 0x2 (E)]
Aug 29 15:51:33.880334 rule 0/(match) block in on vio0: 45.55.22.21.53510 > 45.FOO.BAR.IP.2362: udp 14
Aug 29 15:51:34.006656 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6491: S 151489102:151489102(0) win 1024 [tos 0x28]
Aug 29 15:51:34.274654 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6491: R 151489103:151489103(0) win 1200 [tos 0x28]
Aug 29 15:51:36.393019 rule 0/(match) block in on vio0: 60.191.38.78.4249 > 45.FOO.BAR.IP.8000: S 3746478095:3746478095(0) win 29200 (DF)
Aug 29 15:51:57.213051 rule 0/(match) block in on vio0: 24.137.245.138.7343 > 45.FOO.BAR.IP.5358: S 14134:14134(0) win 14600
Aug 29 15:52:37.852219 rule 0/(match) block in on vio0: 122.226.185.125.51128 > 45.FOO.BAR.IP.23: S 1715745381:1715745381(0) win 5840 <mss 1420,sackOK,timestamp 13511417 0,nop,wscale 2> (DF)
Aug 29 15:53:31.309325 rule 0/(match) block in on vio0: 189.218.148.69.377 > 45.FOO.BAR.IP5358: S 65340:65340(0) win 14600 [tos 0x28]
Aug 29 15:53:31.809570 rule 0/(match) block in on vio0: 13.93.104.140.53184 > 45.FOO.BAR.IP.1433: S 39854048:39854048(0) win 1024
Aug 29 15:53:32.138231 rule 0/(match) block in on vio0: 13.93.104.140.53184 > 45.FOO.BAR.IP.1433: R 39854049:39854049(0) win 1200
Aug 29 15:53:41.459088 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6028: S 168338703:168338703(0) win 1024
Aug 29 15:53:41.789732 rule 0/(match) block in on vio0: 77.72.82.22.47218 > 45.FOO.BAR.IP.6028: R 168338704:168338704(0) win 1200
Aug 29 15:54:34.993594 rule 0/(match) block in on vio0: 212.47.234.50.5102 > 45.FOO.BAR.IP.5060: udp 408 (DF) [tos 0x28]
Aug 29 15:54:57.987449 rule 0/(match) block in on vio0: 51.15.69.145.5100 > 45.FOO.BAR.IP.5060: udp 406 (DF) [tos 0x28]
Aug 29 15:55:07.001743 rule 0/(match) block in on vio0: 190.83.174.214.58863 > 45.FOO.BAR.IP.23: S 757158343:757158343(0) win 27420
Aug 29 15:55:51.269549 rule 0/(match) block in on vio0: 142.217.201.69.26112 > 45.FOO.BAR.IP.22: S 757158343:757158343(0) win 22840 <mss 1460>
Aug 29 15:58:41.346028 rule 0/(match) block in on vio0: 169.1.29.111.29765 > 45.FOO.BAR.IP.23: S 757158343:757158343(0) win 28509
Aug 29 15:59:11.575927 rule 0/(match) block in on vio0: 187.160.235.162.32427 > 45.FOO.BAR.IP.5358: S 22445:22445(0) win 14600 [tos 0x28]
Aug 29 15:59:37.826598 rule 0/(match) block in on vio0: 94.74.81.97.54656 > 45.FOO.BAR.IP.3128: S 2720157526:2720157526(0) win 1024 [tos 0x28]stateful
Aug 29 15:59:37.991171 rule 0/(match) block in on vio0: 94.74.81.97.54656 > 45.FOO.BAR.IP.3128: R 2720157527:2720157527(0) win 1200 [tos 0x28]
Aug 29 16:01:36.990050 rule 0/(match) block in on vio0: 182.18.8.28.23299 > 45.FOO.BAR.IP.445: S 1510146048:1510146048(0) win 16384

如果要查看实时日志,可以运行:

# tcpdump -n -e -ttt -i pflog0

如果你想了解更多信息,可以访问 PF FAQFreeBSD HANDBOOK 以及下面这些 man 页面:

# man tcpdump
# man pfctl
# man pf

关于作者

我是 nixCraft 的创立者,一个经验丰富的系统管理员,同时也是一位 Linux 操作系统/Unix shell 脚本培训师。我在不同的行业与全球客户工作过,包括 IT、教育、国防和空间研究、以及非营利组织。你可以在 TwitterFacebookGoogle+ 上面关注我。


via: https://www.cyberciti.biz/faq/how-to-set-up-a-firewall-with-pf-on-freebsd-to-protect-a-web-server/

作者:Vivek Gite 译者:ucasFL 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你好 Linux 新手!今天,我为你们带来了一个好消息!你也许想知道如何选择合适的 Linux 发行版。当然,你可能已经咨询过一些 Linux 专家来帮助你的需要选择 Linux 发行版。你们中的一些人可能已经用 Google 搜索并浏览了各种资源、Linux 论坛、网站和博客来寻找完美的发行版。好了,你不必再那样做了。有了 Distrochooser,一个帮助你轻松找到 Linux 发行版的网站。

Distrochooser 如何帮助 Linux 初学者选择合适的 Linux 发行版?

Distrochooser 会根据你的答案向你询问一系列问题并建议你尝试不同的 Linux 发行版。激动吗?太好了!让我们继续看看如何找到合适的 Linux 发行版。单击以下链接开始。

你将被重定向到 Distrochooser 主页,其中有一个小测试在等待你注册。

你需要回答一系列问题(准确地说是 16 个问题)。问题同时有单选和多选。以下是完整的问题列表。

  1. 软件:使用情况
  2. 计算机知识
  3. Linux 知识
  4. 安装:预设
  5. 安装:需要 Live 测试么?
  6. 安装:硬件支持
  7. 配置:帮助源
  8. 发行版:用户体验概念
  9. 发行版:价格
  10. 发行版:范围
  11. 发行版:意识形态
  12. 发行版:隐私
  13. 发行版:预设主题,图标和壁纸
  14. 发行版:特色
  15. 软件:管理
  16. 软件:更新

仔细阅读问题并在相应问题下面选择合适的答案。Distrochooser 提供了更多选择来选择接近完美的发行版。

  • 你总是可以跳过问题,
  • 你可以随时点击“获取结果”,
  • 你可以任意顺序回答,
  • 你可以随时删除答案,
  • 你可以在测试结束时对属性进行加权,以强调对你来说重要的内容。

选择问题的答案后,单击“Proceed”以转到下一个问题。完成后,单击“Get Result”按钮。你也可以通过单击答案下面的“Clear”按钮随时清除选择。

结果?

我以前不相信 Distrochooser 会找到我想要的东西。哦,我错了!令我惊讶的是,它确实做得很好。结果对我来说几乎是准确的。我期待 Arch Linux 在结果中,结果确实是在推荐第一位,接下来是其他 11 个建议,如 NixOS、Void Linux、Qubes OS、Scientific Linux、Devuan、Gentoo Linux、Bedrock Linux、Slackware、CentOS、Linux from scratch、Redhat Enterprise Linux。总共有 12 个推荐,每个结果都非常详细,带有发行版的描述和主页。

我在 Reddit 上发布了 Distrochooser 链接,80% 的用户可以找到合适的 Linux 发行版。但是,我不会声称 Distrochooser 足以为每个人找到好结果。一些用户对调查结果感到失望,甚至结果与他们使用中或者想要使用的一点不接近。因此,我强烈建议你在尝试任何 Linux 之前咨询其他 Linux 专家、网站和论坛。你可以在这里阅读完整的 Reddit 讨论。

你在等什么?进入 Distrochooser 网站并为你选择合适的 Linux 发行版吧。

就是这些了。还有更多好东西。敬请期待!

干杯!


via: https://www.ostechnix.com/distrochooser-helps-linux-beginners-to-choose-a-suitable-linux-distribution/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有没有想过用 Python 做你的 shell?

Shell 语言对交互式使用很有用。但是在使用它们作为编程语言时这种优化就需要权衡,有时在编写 shell 脚本时会感觉到这点。

如果你的 shell 也能理解一种更可伸缩的语言会怎样?比如说,Python?

进入 Xonsh

安装 Xonsh 就像创建虚拟环境一样简单,运行 pip install xonsh [ptk,linux],然后运行 xonsh

首先,你可能奇怪为什么你的 Python shell 有一个奇怪的提示:

$ 1+1
2

好的,计算器!

$ print("hello world")
hello world

我们还可以调用其他函数:

$ from antigravity import geohash
$ geohash(37.421542, -122.085589, b'2005-05-26-10458.68')
37.857713 -122.544543

然而,我们仍然可以像常规 shell 一样使用它:

$ echo "hello world"
hello world

我们甚至可以混搭!

$ for i in range(3):
.     echo "hello world"
.
hello world
hello world
hello world

Xonsh 支持使用 Prompt Toolkit 补全 shell 命令和 Python 表达式。补全有可视化提示,会显示可能的补全并有下拉列表。

它还支持访问环境变量。它使用简单但强大的启发式方法将 Python 类型应用于环境变量。默认值为 “string”,但是,例如,路径变量是自动列表。

$ '/usr/bin' in $PATH
True

Xonsh 接受 shell 形式或 Python 形式的布尔快捷运算符:

$ cat things
foo
$ grep -q foo things and echo "found"
found
$ grep -q bar things && echo "found"
$ grep -q foo things or echo "found"
$ grep -q bar things || echo "found"
found

这意味着 Python 关键字是被解释了。如果我们想要打印著名的《苏斯博士》书的标题,我们需要引用关键词。

$ echo green eggs "and" ham
green eggs and ham

如果我们不这样做,我们会感到惊讶:

$ echo green eggs and ham
green eggs
xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True
xonsh: subprocess mode: command not found: ham
Did you mean one of the following?
    as:   Command (/usr/bin/as)
    ht:   Command (/usr/bin/ht)
    mag:  Command (/usr/bin/mag)
    ar:   Command (/usr/bin/ar)
    nm:   Command (/usr/bin/nm)

虚拟环境可能会有点棘手。一般的虚拟环境(取决于它们类似 Bash 的语法)无法工作。但是,Xonsh 自带了一个名为 vox 的虚拟环境管理系统。

vox 可以创建、激活和停用 ~/.virtualenvs 中的环境。如果你用过 virtualenvwrapper,这就是环境变量所在的地方。

请注意,当前激活的环境不会影响 xonsh。它无法从激活的环境中导入任何内容。

$ xontrib load vox
$ vox create my-environment                                                    
...
$ vox activate my-environment        
Activated "my-environment".                                                    
$ pip install money                                                            
...
$ python                                                              
...
>>> import money                                                              
>>> money.Money('3.14')                        
$ import money
xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True
ModuleNotFoundError: No module named 'money'

第一行启用 vox:它是一个 xontrib,是 Xonsh 的一个第三方扩展。xontrib 管理器可以列出所有可能的 xontribs 及其当前状态(已安装、已加载或未加载)。

可以编写一个 xontrib 并上传到 PyPi 以使其可用。但是,最好将它添加到 xontrib 索引中,以便 Xonsh 提前知道它。比如,这能让配置向导建议它。

如果你曾经想过,“Python 可以成为我的 shell 吗?”,然后你只要 pip install xonsh 一下就能知道。


via: https://opensource.com/article/18/9/xonsh-bash-alternative

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

查看硬盘使用情况对于类 Unix 操作系统来说不是什么大问题。我们有一个名为 du 的内置命令,可以在几分钟之内计算和汇总磁盘空间的使用情况。此外,我们还有一些第三方工具,比如 NcduAgedu,它们也可以用来追踪磁盘使用情况。如您所见,这些都是命令行中的实用程序,磁盘使用情况将以纯文本的形式显示。但是,有些人希望以可视化、图表的形式查看结果。别担心!我知道一个 GUI 工具可以显示磁盘使用细节。它就是 “Filelight”,这是一个图形化实用程序,用于可视化显示 Linux 系统上的磁盘使用情况,并以彩色径向图显示结果。Filelight 是历史最悠久的项目之一,它已经存在了很长时间,它完全免费使用并开源。

安装 Filelight

Filelight 是 KDE 应用程序的一部分,并预装在基于 KDE 的 Linux 发行版上。

如果您使用的是非 KDE 发行版,官方存储库中包含了 Filelight,因此您可以使用默认的包管理器进行安装。

在 Arch Linux 及其衍生版,如 Antergos、Manjaro Linux 中,Filelight 可以按照如下方法安装。

$ sudo pacman -S filelight

在 Debian、Ubuntu、Linux Mint 中,

$ sudo apt install filelight

在 Fedora 中,

$ sudo dnf install filelight

在 openSUSE 中,

$ sudo zypper install filelight

可视化查看 Linux 系统上的磁盘使用情况

安装后,从菜单或应用程序启动器启动 Filelight。

Filelight 以图形方式将您的文件系统表示为一组同心圆环段。

如您所见,Filelight 默认显示磁盘中 //boot 文件系统的使用情况。

您还可以选择扫描的各个文件夹,以查看该特定文件夹的磁盘使用情况。为此,请到 “Filelight -> Scan -> Scan Folder” 并选择要扫描的文件夹。

Filelight 在扫描时排除以下目录:

  • /dev
  • /proc
  • /sys
  • /root

此选项有助于跳过您可能没有权限读取的目录,或者属于虚拟文件系统的文件夹,例如 /proc

如果您想要在此列表中增加文件夹,请到 “Filelight -> Settings -> Scanning” 并点击 “Add” 按钮然后选择您想要增加的文件夹。

类似的,要想从此列表中移除某个文件夹,选择文件夹并点击 “Remove”。

如果您想要改变 Filelight 的外观,请到 “Settings - > Appearance” 栏,按照您的喜好改变配色方案。

径向图中的每个段用不同的颜色表示。下图显示了 / 文件系统的整个径向布局。要查看文件和文件夹的完整信息,只需将鼠标指针悬停在它们上边。

只需点击相应的段即可浏览文件系统。要查看某个文件或文件夹的磁盘使用情况,只需单击它们即可获得该特定文件夹、文件的完整磁盘使用情况。

不仅仅是本地文件系统,Filelight 还能够扫描远程磁盘和可移动磁盘。 如果您使用任何基于 KDE 的 Linux 发行版,它可以集成到 Konqueror、Dolphin 和 Krusader 等文件管理器中。

与 CLI 实用程序不同,您不必使用任何额外的参数或选项来以易读的(而非乱码的)格式查看结果。 默认情况下,Filelight 将自动以易读的格式显示磁盘使用情况。

总结

使用 Filelight,您可以快速找到文件系统中占用磁盘空间的位置,并通过删除不需要的文件或文件夹释放空间。 如果您正在寻找一些简单且易上手的图形界面磁盘使用情况查看器,那么 Filelight 值得一试。

就是这样。希望这篇文章对您有用。更多的好文章,敬请关注!

干杯!


via: https://www.ostechnix.com/filelight-visualize-disk-usage-on-your-linux-system/

作者:SK 选题:lujun9972 译者:XiatianSummer 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在这篇开源项目管理工具的综述中,让我们来了解一下支持 Scrum、 看板 Kanban 等敏捷开发模式的软件。

Opensource.com 以前对流行的开源项目管理工具做过相应的调研。但是今年我们增加了一个特点。本次,我们特别关注支持敏捷方法的工具,包括相关的实践,如 Scrum、Lean 和 看板 Kanban

对敏捷开发的兴趣和使用的增长是我们今年决定专注于这些工具的原因。大多数组织(71%)的人说他们至少使用了敏捷方式。此外,敏捷项目比传统方法管理的项目 要高出 28% 的成功率

我们查看了 201420152016 中涉及的项目管理工具,并挑选了支持敏捷的工具,然后对没有涉及的或变化了的进行了研究。不管您的组织是否已经在使用敏捷开发,或者在 2018 年的众多计划之一是采用敏捷方法,这七个开源项目管理工具之一可能正是您所要找寻的。

MyCollab

MyCollab 是一套针对中小型企业的三个协作模块套件:项目管理、客户关系管理(CRM)和文档创建和编辑软件。有两个许可证选项:一个商业的“终极”版本,它更快,可以在内部或云中运行;另一个开源的“社区版本”,这个正是我们感兴趣的版本。

由于没有使用查询缓存,社区版本没有云方式,并且速度较慢,但是提供了基本的项目管理特性,包括任务、问题管理、活动流、路线图视图和敏捷团队看板。虽然它没有单独的移动应用程序,但它也适用于移动设备,包括 Windows、Mac OS、Linux 和 UNIX 计算机。

MyCollab 的最新版本是 5.4.10,源代码可在 GitHub 上下载。它是在 AGPLv3 下进行授权的,需要 Java 运行时环境和 MySQL 支持。它可运行于 Windows、Linux、UNIX 和 MacOS。下载地址

Odoo

Odoo 不仅仅是项目管理软件;它是一个完整的集成商业应用套件,包括会计、人力资源、网站和电子商务、库存、制造、销售管理(CRM)和其它工具。

与付费企业套件相比,免费的开源社区版具有有限的 特性 。它的项目管理应用程序包括敏捷团队的看板式任务跟踪视图,在最新版本 Odoo 11.0 中更新了该视图,以包括用于跟踪项目状态的进度条和动画。项目管理工具还包括甘特图、任务、问题、图表等等。Odoo 有一个繁荣的社区,并提供 用户指南 及其他培训资源。

它是在 GPLv3 下授权的,需要 Python 和 PostgreSQL 支持。作为Docker 镜像 可以运行在 Windows、Linux 和 Red Hat 包管理器中,下载地址download,源代码GitHub

OpenProject

OpenProject 是一个强大的开源项目管理工具,以其易用性和丰富的项目管理和团队协作特性而著称。

它的模块支持项目计划、调度、路线图和发布计划、时间跟踪、成本报告、预算、bug 跟踪以及敏捷和 Scrum。它的敏捷特性,包括创建 Story、确定 sprint 的优先级以及跟踪任务,都与 OpenProject 的其他模块集成在一起。

OpenProject 在 GPLv3 下获得许可,其源代码可在GitHub上。最新版本 7.3.2 的 Linux 版本 在此下载;您可以在 Birthe Lindenthal 的文章 “OpenProject 入门”中了解更多关于安装和配置它的信息。

OrangeScrum

正如从其名称中猜到的,OrangeScrum 支持敏捷方法,特别是使用 Scrum 任务板和看板式工作流视图。它面向较小的组织自由职业者、中介机构和中小型企业。

开源版本提供了 OrangeScrum 付费版本中的许多 特性,包括移动应用程序、资源利用率和进度跟踪。其他特性,包括甘特图、时间日志、发票和客户端管理,可以作为付费附加组件提供,付费版本包括云选项,而社区版本不提供。

OrangeScrum 是基于 GPLv3 授权的,是基于 CakePHP 框架开发。它需要 Apache、PHP 5.3 或更高版本和 MySQL 4.1 或更高版本支持,并可以在 Windows、Linux 和 Mac OS 上运行。其最新版本 1.1.1 在此下载,其源码在 GitHub

]project-open[

[]project-open[](http://www.project-open.com/en/list-installers) 是一个双许可证的企业项目管理工具,这意味着其核心是开源的,并且在商业许可的模块中可以使用一些附加特性。根据该项目的社区和企业版本的 比较,开源核心为中小型组织提供了许多特性。

]project-open 支持带有 Scrum 和看板功能的 [敏捷 项目,以及经典的甘特/瀑布项目和混合或混合项目。

该应用程序是在 GPL 下授权的,并且 源代码是通过 CVS 访问的。 ]project-open 在 Linux 和 Windows 的安装有 [安装程序,但也可以在云镜像和虚拟设备中使用。

Taiga

Taiga 是一个开源项目管理平台,它专注于 Scrum 和敏捷开发,其特征包括看板、任务、sprints、问题、backlog 和 epics。其他功能包括凭证管理、多项目支持、Wiki 页面和第三方集成。

它还为 iOS、Android 和 Windows 设备提供免费的移动应用程序,并提供导入工具,使从其他流行的项目管理应用程序迁移变得容易。

Taiga 对于公共项目是免费的,对项目数量或用户数量没有限制。对于私有项目,在“免费增值”模式下,有很多 付费计划 可用,但是值得注意的是,无论您属于哪种类型,软件的功能特性都是一样的。

Taiga 是在 GNU Affero GPLv3 下授权的,并且软件需要 Nginx、Python 和 PostgreSQL 支持。最新版本3.1.0 Perovskia atriplicifolia,可在 GitHub 上下载。

Tuleap

Tuleap 是一个应用程序生命周期管理(ALM)平台,旨在为每种类型的团队管理项目——小型、中型、大型、瀑布、敏捷或混合型——但是它对敏捷团队的支持是显著的。值得注意的是,它为 Scrum、看板、sprints、任务、报告、持续集成、backlogs 等提供支持.

其他的 特性 包括问题跟踪、文档跟踪、协作工具,以及与 Git、SVN 和 Jenkins 的集成,所有这些都使它成为开放源码软件开发项目的吸引人的选择。

Tuleap 是在 GPLv2 下授权的。更多信息,包括 Docker 和 CentOS 下载,可以在他们的 入门 页面上找到。您还可以在 Tuleap 的 Git 上获取其最新版本 9.14 的源代码。


这种类型的文章的麻烦在于它一发布就过时了。您正在使用哪些开源项目管理工具,而被我们遗漏了?或者您对我们提到的有反馈意见吗?请在下面留下留言。


via: https://opensource.com/article/18/2/agile-project-management-tools

作者:Opensource.com 译者:heguangzhi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过学习这些关键的术语和概念来理解 Python 应用监测。

 title=

当我第一次看到术语“ 计数器 counter ”和“ 计量器 gauge ”和使用颜色及标记着“平均数”和“大于 90%”的数字图表时,我的反应之一是逃避。就像我看到它们一样,我并不感兴趣,因为我不理解它们是干什么的或如何去使用。因为我的工作不需要我去注意它们,它们被我完全无视。

这都是在两年以前的事了。随着我的职业发展,我希望去了解更多关于我们的网络应用程序的知识,而那个时候就是我开始去学习 监测指标 metrics 的时候。

我的理解监测的学习之旅共有三个阶段(到目前为止),它们是:

  • 阶段 1:什么?(王顾左右)
  • 阶段 2:没有指标,我们真的是瞎撞。
  • 阶段 3:出现不合理的指标我们该如何做?

我现在处于阶段 2,我将分享到目前为止我学到了些什么。我正在向阶段 3 进发,在本文结束的位置我提供了一些我正在使用的学习资源。

我们开始吧!

需要的软件

在文章中讨论时用到的 demo 都可以在 我的 GitHub 仓库 中找到。你需要安装 docker 和 docker-compose 才能使用它们。

为什么要监测?

关于监测的主要原因是:

  • 理解 正常的 和 不正常的 系统和服务的特征
  • 做容量规划、弹性伸缩
  • 有助于排错
  • 了解软件/硬件改变的效果
  • 测量响应中的系统行为变化
  • 当系统出现意外行为时发出警报

指标和指标类型

从我们的用途来看,一个指标就是在一个给定时间点上的某些数量的 测量 值。博客文章的总点击次数、参与讨论的总人数、在缓存系统中数据没有被找到的次数、你的网站上的已登录用户数 —— 这些都是指标的例子。

它们总体上可以分为三类:

计数器

以你的个人博客为例。你发布一篇文章后,过一段时间后,你希望去了解有多少点击量,这是一个只会增加的数字。这就是一个 计数器 counter 指标。在你的博客文章的生命周期中,它的值从 0 开始增加。用图表来表示,一个计数器看起来应该像下面的这样:

 title=

一个计数器指标总是在增加的。

计量器

如果你想去跟踪你的博客每天或每周的点击量,而不是基于时间的总点击量。这种指标被称为一个 计量器 gauge ,它的值可上可下。用图表来表示,一个计量器看起来应该像下面的样子:

 title=

一个计量器指标可以增加或减少。

一个计量器的值在某些时间窗口内通常有一个 最大值 ceiling 和<ruby最小值floor。

柱状图和计时器

柱状图 histogram (在 Prometheus 中这么叫它)或 计时器 timer (在 StatsD 中这么叫它)是一个跟踪 已采样的观测结果 的指标。不像一个计数器类或计量器类指标,柱状图指标的值并不是显示为上或下的样式。我知道这可能并没有太多的意义,并且可能和一个计量器图看上去没有什么不同。它们的不同之处在于,你期望使用柱状图数据来做什么,而不是与一个计量器图做比较。因此,监测系统需要知道那个指标是一个柱状图类型,它允许你去做哪些事情。

 title=

一个柱状图指标可以增加或减少。

Demo 1:计算和报告指标

Demo 1 是使用 Flask 框架写的一个基本的 web 应用程序。它演示了我们如何去 计算 和 报告 指标。

src 目录中有 app.pysrc/helpers/middleware.py 应用程序,包含以下内容:

from flask import request
import csv
import time


def start_timer():
    request.start_time = time.time()


def stop_timer(response):
    # convert this into milliseconds for statsd
    resp_time = (time.time() - request.start_time)*1000
    with open('metrics.csv', 'a', newline='') as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow([str(int(time.time())), str(resp_time)])

    return response


def setup_metrics(app):
    app.before_request(start_timer)
    app.after_request(stop_timer)

当在应用程序中调用 setup_metrics() 时,它配置在一个请求被处理之前调用 start_timer() 函数,然后在该请求处理之后、响应发送之前调用 stop_timer() 函数。在上面的函数中,我们写了时间戳并用它来计算处理请求所花费的时间。

当我们在 demo1 目录中运行 docker-compose up,它会启动这个 web 应用程序,然后在一个客户端容器中可以生成一些对 web 应用程序的请求。你将会看到创建了一个 src/metrics.csv 文件,它有两个字段:timestamprequest_latency

通过查看这个文件,我们可以推断出两件事情:

  • 生成了很多数据
  • 没有观测到任何与指标相关的特征

没有观测到与指标相关的特征,我们就不能说这个指标与哪个 HTTP 端点有关联,或这个指标是由哪个应用程序的节点所生成的。因此,我们需要使用合适的元数据去限定每个观测指标。

《Statistics 101》

(LCTT 译注:这是一本统计学入门教材的名字)

假如我们回到高中数学,我们应该回忆起一些统计术语,虽然不太确定,但应该包括平均数、中位数、百分位和柱状图。我们来简要地回顾一下它们,不用去管它们的用法,就像是在上高中一样。

平均数

平均数 mean ,即一系列数字的平均值,是将数字汇总然后除以列表的个数。3、2 和 10 的平均数是 (3+2+10)/3 = 5。

中位数

中位数 median 是另一种类型的平均,但它的计算方式不同;它是列表从小到大排序(反之亦然)后取列表的中间数字。以我们上面的列表中(2、3、10),中位数是 3。计算并不是非常直观,它取决于列表中数字的个数。

百分位

百分位 percentile 是指那个百(千)分比数字低于我们给定的百分数的程度。在一些场景中,它是指这个测量值低于我们数据的百(千)分比数字的程度。比如,上面列表中 95% 是 9.29999。百分位的测量范围是 0 到 100(不包括)。0% 是一组数字的最小分数。你可能会想到它的中位数是 50%,它的结果是 3。

一些监测系统将百分位称为 upper_X,其中 X 就是百分位;upper 90 指的是在 90% 的位置的值。

分位数

“q-分位数”是将有 N 个数的集合等分为 qN 级。q 的取值范围为 0 到 1(全部都包括)。当 q 取值为 0.5 时,值就是中位数。( 分位数 quantile )和百分位数的关系是,分位数值 q 等于 100 百分位值。

柱状图

<ruby柱状图histogram这个指标,我们前面学习过,它是监测系统中一个实现细节。在统计学中,一个柱状图是一个将数据分组为 桶 的图表。我们来考虑一个人为的不同示例:阅读你的博客的人的年龄。如果你有一些这样的数据,并想将它进行大致的分组,绘制成的柱状图将看起来像下面的这样:

 title=

累积柱状图

一个 累积柱状图 cumulative histogram 也是一个柱状图,它的每个桶的数包含前一个桶的数,因此命名为累积。将上面的数据集做成累积柱状图后,看起来应该是这样的:

 title=

我们为什么需要做统计?

在上面的 Demo 1 中,我们注意到在我们报告指标时,这里生成了许多数据。当我们将它们用于指标时我们需要做统计,因为它们实在是太多了。我们需要的是整体行为,我们没法去处理单个值。我们预期展现出来的值的行为应该是代表我们观察的系统的行为。

Demo 2:在指标上增加特征

在我们上面的的 Demo 1 应用程序中,当我们计算和报告一个请求的延迟时,它指向了一个由一些特征 唯一标识的特定请求。下面是其中一些:

  • HTTP 端点
  • HTTP 方法
  • 运行它的主机/节点的标识符

如果我们将这些特征附加到要观察的指标上,每个指标将有更多的内容。我们来解释一下 Demo 2 中添加到我们的指标上的特征。

在写入指标时,src/helpers/middleware.py 文件将在 CSV 文件中写入多个列:

node_ids = ['10.0.1.1', '10.1.3.4']


def start_timer():
    request.start_time = time.time()


def stop_timer(response):
    # convert this into milliseconds for statsd
    resp_time = (time.time() - request.start_time)*1000
    node_id = node_ids[random.choice(range(len(node_ids)))]
    with open('metrics.csv', 'a', newline='') as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow([
            str(int(time.time())), 'webapp1', node_id,
            request.endpoint, request.method, str(response.status_code),
            str(resp_time)
        ])

    return response

因为这只是一个演示,在报告指标时,我们将随意的报告一些随机 IP 作为节点的 ID。当我们在 demo2 目录下运行 docker-compose up 时,我们的结果将是一个有多个列的 CSV 文件。

用 pandas 分析指标

我们将使用 pandas 去分析这个 CSV 文件。运行 docker-compose up 将打印出一个 URL,我们将使用它来打开一个 Jupyter 会话。一旦我们上传 Analysis.ipynb notebook 到会话中,我们就可以将 CSV 文件读入到一个 pandas 数据帧 DataFrame 中:

import pandas as pd
metrics = pd.read_csv('/data/metrics.csv', index_col=0)

index_col 表明我们要指定时间戳作为索引。

因为每个特征我们都要在数据帧中添加一个列,因此我们可以基于这些列进行分组和聚合:

import numpy as np
metrics.groupby(['node_id', 'http_status']).latency.aggregate(np.percentile, 99.999)

更多内容请参考 Jupyter notebook 在数据上的分析示例。

我应该监测什么?

一个软件系统有许多的变量,这些变量的值在它的生命周期中不停地发生变化。软件是运行在某种操作系统上的,而操作系统同时也在不停地变化。在我看来,当某些东西出错时,你所拥有的数据越多越好。

我建议去监测的关键操作系统指标有:

  • CPU 使用
  • 系统内存使用
  • 文件描述符使用
  • 磁盘使用

还需要监测的其它关键指标根据你的软件应用程序不同而不同。

网络应用程序

如果你的软件是一个监听客户端请求和为它提供服务的网络应用程序,需要测量的关键指标还有:

  • 入站请求数(计数器)
  • 未处理的错误(计数器)
  • 请求延迟(柱状图/计时器)
  • 排队时间,如果在你的应用程序中有队列(柱状图/计时器)
  • 队列大小,如果在你的应用程序中有队列(计量器)
  • 工作进程/线程用量(计量器)

如果你的网络应用程序在一个客户端请求的环境中向其它服务发送请求,那么它应该有一个指标去记录它与那个服务之间的通讯行为。需要监测的关键指标包括请求数、请求延迟、和响应状态。

HTTP web 应用程序后端

HTTP 应用程序应该监测上面所列出的全部指标。除此之外,还应该按 HTTP 状态代码分组监测所有非 200 的 HTTP 状态代码的大致数据。如果你的 web 应用程序有用户注册和登录功能,同时也应该为这个功能设置指标。

长时间运行的进程

长时间运行的进程如 Rabbit MQ 消费者或任务队列的工作进程,虽然它们不是网络服务,它们以选取一个任务并处理它的工作模型来运行。因此,我们应该监测请求的进程数和这些进程的请求延迟。

不管是什么类型的应用程序,都有指标与合适的元数据相关联。

将监测集成到一个 Python 应用程序中

将监测集成到 Python 应用程序中需要涉及到两个组件:

  • 更新你的应用程序去计算和报告指标
  • 配置一个监测基础设施来容纳应用程序的指标,并允许去查询它们

下面是记录和报告指标的基本思路:

def work():
    requests += 1
    # report counter
    start_time = time.time()
    
    # < do the work >

    # calculate and report latency
    work_latency = time.time() - start_time
    ...

考虑到上面的模式,我们经常使用修饰符、内容管理器、中间件(对于网络应用程序)所带来的好处去计算和报告指标。在 Demo 1 和 Demo 2 中,我们在一个 Flask 应用程序中使用修饰符。

指标报告时的拉取和推送模型

大体来说,在一个 Python 应用程序中报告指标有两种模式。在 拉取 模型中,监测系统在一个预定义的 HTTP 端点上“刮取”应用程序。在推送 模型中,应用程序发送数据到监测系统。

 title=

工作在 拉取 模型中的监测系统的一个例子是 Prometheus。而 StatsD 是 推送 模型的一个例子。

集成 StatsD

将 StatsD 集成到一个 Python 应用程序中,我们将使用 StatsD Python 客户端,然后更新我们的指标报告部分的代码,调用合适的库去推送数据到 StatsD 中。

首先,我们需要去创建一个客户端实例:

statsd = statsd.StatsClient(host='statsd', port=8125, prefix='webapp1')

prefix 关键字参数将为通过这个客户端报告的所有指标添加一个指定的前缀。

一旦我们有了客户端,我们可以使用如下的代码为一个计时器报告值:

statsd.timing(key, resp_time)

增加计数器:

statsd.incr(key)

将指标关联到元数据上,一个键的定义为:metadata1.metadata2.metric,其中每个 metadataX 是一个可以进行聚合和分组的字段。

这个演示应用程序 StatsD 是将 statsd 与 Python Flask 应用程序集成的一个完整示例。

集成 Prometheus

要使用 Prometheus 监测系统,我们使用 Promethius Python 客户端。我们将首先去创建有关的指标类对象:

REQUEST_LATENCY = Histogram('request_latency_seconds', 'Request latency',
    ['app_name', 'endpoint']
)

在上面的语句中的第三个参数是与这个指标相关的标识符。这些标识符是由与单个指标值相关联的元数据定义的。

去记录一个特定的观测指标:

REQUEST_LATENCY.labels('webapp', request.path).observe(resp_time)

下一步是在我们的应用程序中定义一个 Prometheus 能够刮取的 HTTP 端点。这通常是一个被称为 /metrics 的端点:

@app.route('/metrics')
def metrics():
    return Response(prometheus_client.generate_latest(), mimetype=CONTENT_TYPE_LATEST)

这个演示应用程序 Prometheus 是将 prometheus 与 Python Flask 应用程序集成的一个完整示例。

哪个更好:StatsD 还是 Prometheus?

本能地想到的下一个问题便是:我应该使用 StatsD 还是 Prometheus?关于这个主题我写了几篇文章,你可能发现它们对你很有帮助:

指标的使用方式

我们已经学习了一些关于为什么要在我们的应用程序上配置监测的原因,而现在我们来更深入地研究其中的两个用法:报警和自动扩展。

使用指标进行报警

指标的一个关键用途是创建警报。例如,假如过去的五分钟,你的 HTTP 500 的数量持续增加,你可能希望给相关的人发送一封电子邮件或页面提示。对于配置警报做什么取决于我们的监测设置。对于 Prometheus 我们可以使用 Alertmanager,而对于 StatsD,我们使用 Nagios

使用指标进行自动扩展

在一个云基础设施中,如果我们当前的基础设施供应过量或供应不足,通过指标不仅可以让我们知道,还可以帮我们实现一个自动伸缩的策略。例如,如果在过去的五分钟里,在我们服务器上的工作进程使用率达到 90%,我们可以水平扩展。我们如何去扩展取决于云基础设施。AWS 的自动扩展,缺省情况下,扩展策略是基于系统的 CPU 使用率、网络流量、以及其它因素。然而,让基础设施伸缩的应用程序指标,我们必须发布 自定义的 CloudWatch 指标

在多服务架构中的应用程序监测

当我们超越一个单应用程序架构时,比如当客户端的请求在响应被发回之前,能够触发调用多个服务,就需要从我们的指标中获取更多的信息。我们需要一个统一的延迟视图指标,这样我们就能够知道响应这个请求时每个服务花费了多少时间。这可以用 分布式跟踪 来实现。

你可以在我的博客文章 《在你的 Python 应用程序中通过 Zipkin 引入分布式跟踪》 中看到在 Python 中进行分布式跟踪的示例。

划重点

总之,你需要记住以下几点:

  • 理解你的监测系统中指标类型的含义
  • 知道监测系统需要的你的数据的测量单位
  • 监测你的应用程序中的大多数关键组件
  • 监测你的应用程序在它的大多数关键阶段的行为

以上要点是假设你不去管理你的监测系统。如果管理你的监测系统是你的工作的一部分,那么你还要考虑更多的问题!

其它资源

以下是我在我的监测学习过程中找到的一些非常有用的资源:

综合的

StatsD/Graphite

Prometheus

避免犯错(即第 3 阶段的学习)

在我们学习监测的基本知识时,时刻注意不要犯错误是很重要的。以下是我偶然发现的一些很有见解的资源:


想学习更多内容,参与到 PyCon Cleveland 2018 上的 Amit Saha 的讨论,Counter, gauge, upper 90—Oh my!

关于作者

Amit Saha — 我是一名对基础设施、监测、和工具感兴趣的软件工程师。我是“用 Python 做数学”的作者和创始人,以及 Fedora Scientific Spin 维护者。

关于我的更多信息


via: https://opensource.com/article/18/4/metrics-monitoring-and-python

作者: Amit Saha 选题者: lujun9972 译者: qhwdw 校对: wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出