可配置的通用 Prometheus 监控模块

Prometheus

  Prometheus 是目前最流行的开源系统监控报警框架,易于配置和使用,基于 PromQL 可以很方便的在 Grafana 上展示各种需要的图表。

  Prometheus 的生态丰富各类扩展和支持都非常齐全,基本不需要二次开发,就可以找到你所使用的语言和模块的支持,很方便的嵌入。

指标类型

  • Counter

    Counter 类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。常见的监控指标,如http_requests_totalnode_cpu 都是 Counter 类型的监控指标。 一般在定义 Counter 类型指标的名称时推荐使用 _total 作为后缀。

  • Gauge

    Gauge 类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是 Gauge 类型的监控指标。

  • Histogram

    Histogram<basename>_bucket{le="<upper inclusive bound>"}<basename>_bucket{le="+Inf"}, <basename>_sum<basename>_count 组成,主要用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。如:请求持续时间,响应大小。

  • Summary

    Histogram 类似,由 <basename>{quantile="<φ>"}<basename>_sum<basename>_count 组成,主要用于表示一段时间内数据采样结果(通常是请求持续时间或响应大小),它直接存储了 quantile 数据,而不是根据统计区间计算出来的。

阅读更多

Pika 运维指南

1. 初始化环境

1.1. 安装 pika

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载软件包
PIKA_VERSION="$(wget -qO- https://api.github.com/repos/Qihoo360/pika/releases/latest | grep 'tag_name' | cut -d\" -f4)"
wget -q https://github.com/Qihoo360/pika/releases/download/${PIKA_VERSION}/pika-linux-x86_64-${PIKA_VERSION}.tar.bz2

# 解压软件包
tar xjf pika-linux-x86_64-${PIKA_VERSION}.tar.bz2

# 建立程序目录
mkdir -p /usr/local/pika

# 拷贝 pika 应用程序到程序目录
\cp -arf output/* /usr/local/pika

# 清理安装文件
rm -rf output pika-linux-x86_64-${PIKA_VERSION}.tar.bz2*
阅读更多

Cassandra 学习笔记

1 预研

1.1 横向比较

数据库 模式 特点 驱动
MongoDB Document-based 文档的形式存储数据,不支持事务和表连接;动态查询;支持分片;二进制数据处理效率高; 主流语言
HBase Column-based 分布集群,硬件要求低;易扩展,支持自动分片;支持PB数据集,百万级QPS;写入快; Java & Thrift
Cassandra Column-based 节点无特征,同级平等;易部署,易扩展,线上动态扩展;写入快; 主流语言
阅读更多

在 Finder 中用 iTerm 打开当前目录

需求

  在使用 Mac 的过程中,在终端打开当前目录是一个常见的需求。之前可以通过 xtraFinder 等 Finder 的扩展实现这个需求,但在 macOS 10.12 之后,这类扩展程序只能在禁用系统文件保护的情况下才能使用。
  作为一个强迫症患者,无法忍受禁用系统文件保护带来的风险,但又十分需要这个功能,怎么办?

方案

  于是我开始研究如何使用系统提供的方案来实现需求,经过不懈的努力,找到了很多过期资料,虽然在新版系统上已经无法使用,但是给了我一个思路。
  尝试过多个方案,使用 Automator 配合 AppleScript 的解决方案,应该是目前的最优解决方案。
  基本步骤是:

  1. 获取 Finder 当前文件夹的路径。
  2. 激活 iTerm2。
  3. 如没有窗口则创建窗口。
  4. 当前 Tab 正在使用则创建新 Tab。
  5. 在 Tab 会话中输入 cd 命令并执行。

阅读更多

OpenResty 中的 Redis 使用技巧

前言

  Redis 是非常流行的 NoSQL 数据库之一,因其高效、稳定、开源、数据结构丰富,深受业内钦赖。很幸运,OpenResty 也内置了对 Redis 的支持。
  在使用 OpenResty 的过程中,Redis 一直是主力存储方式之一。虽然 OpenResty 内置了 Redis 驱动,但在实际项目中,对其进行进一步的封装,能更方便的使用和管理。
  在这个过程中,遇到了很多需要注意的点,也积累了一些技巧和经验,在此总结一下。

技巧

单例模式

  单例模式是对数据连接或数据查询工具类的常用处理模式。保持数据连接的单例好处很多,最重要的一点是确保了同一连接的复用,不会被重复打开浪费资源,也方便了连接的管理和状态维护。

阅读更多

妥善的处理重试请求

前言

  手机游戏项目中,由于用户在很多时间使用的是移动网络,和服务器连接不稳定在所难免。客户端发送给服务端的请求没接收到应答,也是经常碰到的情况。
  同样是没有接收到应答,是因为服务端未接收到请求,还是发送应答给客户端失败,客户端很难区分。对客户端来说,这两种情况几乎没有什么分别。
  这会带来一个问题:客户端在无法接收到应答的时候,是否发送重试请求?
  如果是因为服务端没收到请求造成的无应答,那么发送重试请求并没有什么问题。但如果是因为服务端发送应答给客户端失败造成的无应答,那么发送重试请求,会让服务端重复处理已处理过的请求。
  如果只是强化、升级这种请求,重复处理请求也许问题也不是太大。但如果是购买、消费这种请求,重复消费恐怕会引起玩家的重度不适,收到很多吐槽和投诉。

阅读更多

需要“局部变量化”全局函数么?

前言

  在很多的 Lua 语言相关的著作中都强调,在代码头部将代码里使用到的全局函数或者全局库局部变量化,将大大提升代码的执行效率。
  举个栗子,Roberto Ierusalimschy《Lua Programming Gems》 的第二章 Lua Performance Tips 提到:

 除了一些明显的地方外,另有几处也可使用局部变量,可以助你挤出更多的性能。比如,如果在很长的循环里调用函数,可以先将这个函数赋值给一个局部变量。这个代码:

1
2
3
for i = 1, 1000000 do
local x = math.sin(i)
end

比如下代码慢 30%:

1
2
3
4
local sin = math.sin
for i = 1, 1000000 do
local x = sin(i)
end
阅读更多

巧设 Openresty 包含路径

路径的难题

  我在之前的一篇文章中提到,关于 OpenResty 中的文件包含路径,是个值得注意的问题。
  OpenResty 仅会将它自己的 lualib 目录加入 package.pathpackage.cpath,我们的项目目录需要自己处理。
  最初我曾经试过将 项目目录加入到 package.pathpackage.cpath 中,确实达到了目的。
  但在 nginx 上配置了第二个 server 并将它的目录也加入包含路径之后,由于 lua_code_cache 的存在,不同 server 间的相同相对路径的文件的缓存会互相冲突,导致 require 可能不能加载正确的文件。  

巧妙的方案

  其实解决方案来自 PHP 中 autoload 的启发,我使用了一些 nginx 配置和一个单独的函数用来加载项目中的文件。

阅读更多

关于 netstat 命令

使用 netstat

  netstat 命令是 linux 下一个非常有用的命令,顾名思义,其作用是查询当前的网络状态。
  以最常用的查询 TCP 连接状态为例,在 Shell 里运行以下命令:

1
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c

  你会看到当前所有 TCP 连接的状态计数:

屏幕快照

阅读更多

正直帝的传奇经历

前言  

  事情终于告一段落了,暮然回首,感觉还是很有必要写个日志,把我的光辉形象记录下来。

起因

  我有一张中行的美元单标信用卡,绑定了支付宝的快捷支付,可以在淘宝消费,但一直不能用支付宝还款,我每月都测试下,期待能够有一天,可以用支付宝还款。
  2014年2月18日11点左右,我像往常一样,用支付宝向那张中行卡还款1元,过了半小时,还是和往常一样,支付宝告诉我还款失败了。

阅读更多