个人简介:刘攀,腾讯大数据研发工程师,负责腾讯Presto on Alluxio运营、优化工作,Alluxio社区contributor。
导 语
腾讯Alluxio团队利用Alluxio和Grafana对Prometheus的良好支持以及Grafana的模板构建特性可用于快速搭建Alluxio监控系统,通过简单的修改模板变量即可快速适配Alluxio集群,搭建可配置的Alluxio Grafana监控系统。
背景需求
Alluxio有着十分完善的指标系统,用于监控Alluxio master、worker以及client的行为、状态等信息。Alluxio采用Coda Hale Metrics Library组件实现了可配置的metrics 系统,支持诸如CSV、Graphite、Prometheus等不同类别的metrics sink用于Alluxio状态信息的采集和监控系统的建立。Alluxio提供的master web UI集成了部分metrics的可视化呈现,可以方便观察远程读、短路读等指标,然而相较于更加完善和成熟的metrics采集和可视化系统,Alluxio master web UI的可配置性以及对于定制可视化的支持需要进一步提升。
因此,为了满足实际生产需求,腾讯Alluxio团队基于实际业务需求搭建了基于Prometheus和Grafana的Alluxio监控系统,更加直观、全面地呈现了Alluxio指标信息,同时设计了可复用度高的Grafana模板,实现了Alluxio监控系统的快速搭建、开箱即用,大大降低了 Alluxio 的维护成本,现已在腾讯内部上线使用。
Alluxio Metrics Sink分析
Alluxio 提供的便捷的Sink接口用于用户实现定制化的 metrics sink :
/**
* Sink consumes the records generated by the metrics source.
*/
public interface Sink {
/**
* Starts the reporter polling.
*/
void start();
/**
* Stops the reporter.
*/
void stop();
/**
* Reports the current values of all metrics.
*/
void report();
}
目前Alluxio内置支持的Sink有:
其中ConsolesSink、JmxSink、CsvSink 、GraphiteSink以及腾讯Alluxio团队贡献的Slf4jSink都是基于Coda Hale Metrics Library实现的,这些Sink对应的Reporter继承自ScheduledReporter , 提供定时report操作。除此之外,Alluxio维护了两个web metrics sink分别是内建的基于JSON的MetricsServlet和基于Prometheus的 PrometheusSink,这两个Sink服务需要对应的Servlet线程,在Alluxio对应的进程中维护,比如在 master 进程中:
/**
* An Alluxio Master which runs a web and rpc server to handle FileSystem operations.
*/
@NotThreadSafe
public class AlluxioMasterProcess extends MasterProcess {
private static final Logger LOG = LoggerFactory.getLogger(AlluxioMasterProcess.class);
private final MetricsServlet mMetricsServlet = new MetricsServlet(MetricsSystem.METRIC_REGISTRY);
private final PrometheusMetricsServlet mPMetricsServlet = new PrometheusMetricsServlet(
MetricsSystem.METRIC_REGISTRY);
...
}
Alluxio可以通过metrics.properties开启和配置metrics服务,从而实现了metrics sink的延迟加载和灵活扩展,腾讯基于Alluxio提供的Sink接口实现了内部监控系统的对接。
/**
* Starts sinks from a given metrics configuration. This is made public for unit test.
*
* @param config the metrics config
*/
public static synchronized void startSinksFromConfig(MetricsConfig config) {
if (sSinks != null) {
LOG.debug("Sinks have already been started.");
return;
}
LOG.info("Starting sinks with config: {}.", config);
sSinks = new ArrayList<>();
Map<String, Properties> sinkConfigs =
MetricsConfig.subProperties(config.getProperties(), SINK_REGEX);
for (Map.Entry<String, Properties> entry : sinkConfigs.entrySet()) {
String classPath = entry.getValue().getProperty("class");
if (classPath != null) {
LOG.info("Starting sink {}.", classPath);
try {
Sink sink =
(Sink) Class.forName(classPath).getConstructor(Properties.class, MetricRegistry.class)
.newInstance(entry.getValue(), METRIC_REGISTRY);
sink.start();
sSinks.add(sink);
} catch (Exception e) {
LOG.error("Sink class {} cannot be instantiated", classPath, e);
}
}
}
}
整体架构
Alluxio和Grafana对Prometheus都有很好的支持,直接访问http://<MASTER_HOSTNAME:PORT>/metrics/prometheus或者http://<WORKER_HOSTNAME:PORT>/metrics/prometheus即可获得对应的Alluxio Prometheus metrics,因此采用Prometheus作为监控系统的metrics采集组件合适且易用。
Prometheus持续采集Alluxio侧的metrics,按照不同的metrics生成相应的时间序列供后续可视化链路调用。Prometheus提供了内建的查询语言PromQL方便对metrics进行时间维度的加工和查询。Prometheus的优势尤其体现在其易用性,简单的配置文件和启动指令就能快速实现对指定metrics的抓取。
Grafana提供了对多种不同的metrics的支持,多样化的dashboard配置灵活易用,且支持模板导入,是行业内应用十分广泛的可视化监控组件。我们采用了Grafana的模板特性快速搭建应用于不同 Alluxio 集群的监控系统。
快速搭建
推荐使用的版本:
Alluxio : 2.4.1或 master(edge) 、Prometheus: 2.22.2、Grafana: 7.3.4-1
1 .设置 Prometheus 任务
参考文档快速搭建Prometheus。
修改Prometheus配置文件prometheus.yml,填写对应的 job_name 和 Alluxio 节点信息。在我们的方案中,targets 目录下存储了对应集群的 masters、workers 的 IP 和端口信息,利于Alluxio集群扩缩容。Master和worker的metrics分成不同的scrape job,方便后续Grafana对于 metrics 的分类采集,示例:
# prometheus.yml
- job_name: ' Alluxio masters'
metrics_path: /metrics/prometheus
file_sd_configs:
- refresh_interval: 1m
files:
- "targets/cluster/masters/*.yml"
- job_name: ' Alluxio workers'
metrics_path: /metrics/prometheus
file_sd_configs:
- refresh_interval: 1m
files:
- "targets/cluster/workers/*.yml"
# /target/cluster/masters/masters_01.yml
- targets:
- "<master_ip>:19999"
# /target/cluster/masters/workers_01.yml
- targets:
- "<worker1_ip>:30000"
- "<worker2_ip>:30000"
- 导入 Grafana Dashboard
我们将构建的Alluxio监控系统开源在Grafana社区,为Alluxio开发和使用人员提供了简单易用的JSON 模板。
启动Grafana Server并登录Grafana Web UI,下载并导入模板。
为了构建复用性强且易用的模板,我们将构建系统所需要的公用部分进行了抽象,总结出4个接口变量用于快读构建Grafana dashboard,通过修改模板变量适配搭建的 Alluxio 集群:
-
alluxio_datasource :注册在Grafana中对应Alluxio的Prometheus数据源;
-
masters :定义在 prometheus.yml 中的 master job_name;
-
workers :定义在 prometheus.yml 中的workres job_name;
-
alluxio _user :启动Alluxio服务的用户
3. 搭建完成
根据关键程度、指标类型,我们将Alluxio的metrics分为了7类,分别放置在不同的rows:
结 语
腾讯Alluxio团队基于Alluxio强拓展性的metrics系统设计,利用Prometheus和Grafana构建了敏捷性高、复用性强的Alluxio监控系统,只需通过简单地修改模板接口变量即可实现快速复用,搭建易用、可配置的Alluxio监控系统。
腾讯Alluxio团队积极参与Alluxio社区建设,也将持续为Alluxio在大数据生态领域的蓬勃发展贡献力量。