本文共 4387 字,大约阅读时间需要 14 分钟。
项目中有对程序的一个健康检查,以及TPS,QPS等。
文档
*Maven
io.dropwizard.metrics
metrics-core
3.1.0
io.dropwizard.metrics
metrics-servlets
3.1.0
com.codahale.metrics
metrics-healthchecks
3.0.1
com.github.davidb
metrics-influxdb
0.8.2
核心工具类
import com.codahale.metrics.*;
import com.ktyh.think.filter.prometheus.DropwizardExportSetUp;
import io.prometheus.client.CollectorRegistry;
import metrics_influxdb.InfluxdbReporter;
import metrics_influxdb.api.protocols.InfluxdbProtocols;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.concurrent.TimeUnit;
/**
* Created by zhangjianxin on 2016/11/3.
* metrics core config and static void formart
*/
public class MetricsCore {
/**
* 因数据存在争议,改为单例模式。
*/
private static final MetricRegistry METRIC_REGISTRY = new MetricRegistry();
private static String HOST_IP_ADDRESS;
private static String USERNAME;
private static String PASSWORD;
private static String DATABASE;
private static int PORT;
private static ServletRequest ARG_REQ;
private static ServletResponse ARG_RESP;
/**
* @author 内存使用程度MB
*/
Gauge getFreeMemory = () -> toMb(Runtime.getRuntime().freeMemory());
Gauge getTotalMemory = () -> toMb(Runtime.getRuntime().totalMemory());
public static synchronized MetricRegistry getInstance() {
return METRIC_REGISTRY;
}
public static ScheduledReporter influxdbReporter(MetricRegistry metrics) {
InitInfluxdbConfig();//初始化
return InfluxdbReporter.forRegistry(metrics)
.protocol(InfluxdbProtocols.http(HOST_IP_ADDRESS, PORT, USERNAME, PASSWORD, DATABASE))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.filter(MetricFilter.ALL)
.skipIdleMetrics(false)
.build();
}
public static void freeMemoryForJvm(MetricRegistry metrics) {
metrics.register(MetricRegistry.name("memory_free_mb_size"), new Gauge() {
@Override
public Long getValue() {
return toMb(Runtime.getRuntime().freeMemory());
}
});
}
public static void totalMemoryForJvm(MetricRegistry metrics) {
metrics.register(MetricRegistry.name("memory_total_mb_size"), new Gauge() {
@Override
public Long getValue() {
return toMb(Runtime.getRuntime().totalMemory());
}
});
}
//转换为MB
private static long toMb(long bytes) {
return bytes / 1024 / 1024;
}
/**
* 初始化时序数据库配置,可以通过反射进行更改
**/
public static void InitInfluxdbConfig() {
PORT = 8085;
HOST_IP_ADDRESS = "192.168.1.102";
USERNAME = "root";
PASSWORD = "root";
// DATABASE = "Metrics";
DATABASE = "_internal";
}
/**
* 传递初始化参数,用单例去回调
*
* @param "Servlet request and respone"
*/
public static void requestFullArgs(ServletRequest req, ServletResponse resp) {
ARG_REQ = req;
ARG_RESP = resp;
}
/**
* Reporter 数据的展现位置
*
* @param metrics
* @return
*/
public ConsoleReporter consoleReporter(MetricRegistry metrics) {
return ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
}
public Slf4jReporter slf4jReporter(MetricRegistry metrics) {
return Slf4jReporter.forRegistry(metrics)
.outputTo(LoggerFactory.getLogger("demo.metrics"))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
}
public JmxReporter jmxReporter(MetricRegistry metrics, String doMain) {
return JmxReporter.forRegistry(metrics)
.inDomain(doMain)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.filter(MetricFilter.ALL).build();
}
/**
* Meters会将最近1分钟,5分钟,15分钟的TPS(每秒处理的request数)给打印出来,还有所有时间的TPS。
*
* @param metrics
* @return
*/
public Meter requestMeter(MetricRegistry metrics, String arg) {
return metrics.meter(MetricRegistry.name("meter_event_" + arg));
}
/**
* 直方图
*
* @param metrics
* @return
*/
public Histogram responseSizes(MetricRegistry metrics, String arg) {
return metrics.histogram(MetricRegistry.name("size_histogram_" + arg));
}
/**
* 计数器
*
* @param metrics
* @return
*/
public Counter pendingJobs(MetricRegistry metrics, String arg) {
return metrics.counter(MetricRegistry.name("counter_Job_" + arg));
}
/**
* 计时器
*
* @param metrics
* @return
*/
public Timer responsesExecureTime(MetricRegistry metrics, String arg) {
return metrics.timer(MetricRegistry.name("response_timer_" + arg));
}
public Meter requestURLCount(MetricRegistry metrics, String arg) {
return metrics.meter(MetricRegistry.name("request_URL_" + arg));
}
}
##目前这种方式只是将数据推送到influxdb ,以及prometheus 。
1 数据采集
2 采集点(Filter,Controller,Service)
3 数据推送(influxdb,primetheus,jmx,console,cvs等。)
转载地址:https://blog.csdn.net/weixin_33758343/article/details/115780261 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!