Giter Site home page Giter Site logo

minxie1209 / metrics Goto Github PK

View Code? Open in Web Editor NEW
122.0 2.0 0.0 2.75 MB

🔥🔥🔥监控指标,CPU使用情况、类加载统计、垃圾回收器回收情况、内存占用情况、线程运行情况、Tomcat线程池、JDK线程池等。 Monitor metrics, CPU usage, class load statistics, garbage collector collection, memory usage, thread running, Tomcat thread pool, JDK thread pool, etc.

License: Apache License 2.0

Kotlin 82.09% Java 17.91%
grafana java metric netty prometheus bytebuddy jmx jvm kotlin

metrics's Introduction

Metrics

License Commit activity Average time to resolve an issue Percentage of issues still open codecov Build Status

Metrics 是一个暴露应用指标的平台,提供业务无侵入方式对生产级Java服务应用进行指标的监控和暴露。

🔥🔥🔥它提供多种指标的监控:

  • 应用汇总
    • 健康状态 ✅
    • 应用启动时间 ✅
    • JVM版本信息 ✅
  • CPU 情况 ✅
    • CPU使用率 ✅
    • CPU核数 ✅
    • CPU负载 ✅
  • 文件句柄情况 ✅
    • 打开的文件句柄数 ✅
    • 最大可打开的文件句柄数 ✅
  • 类加载情况 ✅
    • 已加载的类数量 ✅
    • 未加载的类数量 ✅
  • Tomcat 运行情况 ✅
    • Tomcat 线程池使用情况 ✅
    • Tomcat 完成的任务数 ✅
  • JDK 线程池运行情况 ✅
    • JDK 线程池使用情况 ✅
    • JDK 线程池完成的任务数 ✅
  • 内存区域占用情况 ✅
    • 堆内存使用情况 ✅
  • GC 垃圾回收情况 ✅
  • 独立线程池运行情况 ✅
    • 运行中的线程数 ✅
    • 守护线程数 ✅
    • 线程状态分类汇总 ✅
    • 单个线程运行情况 ✅
  • 。。。

快速开始

Metrics 在所有主要操作系统上运行,只需要安装 Java JDK 版本 8 或更高版本。

$ java -version
java version "1.8.0_361"

使用 javaagent 的方式运行

把 agent 包放到自定义目录下,如:/tmp/agent-1.0-SNAPSHOT.jar

把 core 包放到同级的 lib 目录下, 如:/tmp/lib/core-1.0-SNAPSHOT.jar

使用 -javaagent 命令启动

java -javaagent:/tmp/agent-1.0-SNAPSHOT.jar -jar demo.jar

MetricServer 会监听 http://127.0.0.1:12345/metrics ,确保该端口没有被本机其他人使用

也可通过命令指定监听的端口

java -javaagent:/tmp/agent-1.0-SNAPSHOT.jar=54321 -jar demo.jar

如果需要做监控大板,可参考 Grafana + Prometheus 方案

示例图

dashboard dashboard dashboard


关注

看到这儿,请给项目一个 star,你的支持是我们前进的动力!

知识星球

知识星球

Star History

Star History Chart

metrics's People

Contributors

minxie1209 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

metrics's Issues

Tomcat扫描jar包失败

org.apache.tomcat.util.scan.StandardJarScanner.processURLs 在多级类加载器中扫描[file:/Users/minxie/IdeaProjects/metrics/agent/target/netty-resolver-dns-native-macos-4.1.72.Final-osx-aarch_64.jar]失败
java.io.FileNotFoundException: /Users/minxie/IdeaProjects/metrics/agent/target/netty-resolver-dns-native-macos-4.1.72.Final-osx-aarch_64.jar (No such file or directory)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:225)
at java.util.zip.ZipFile.(ZipFile.java:155)
at java.util.jar.JarFile.(JarFile.java:166)
at java.util.jar.JarFile.(JarFile.java:130)
at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:209)
at org.apache.tomcat.util.scan.JarFileUrlJar.(JarFileUrlJar.java:65)
at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49)
at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:387)
at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:322)
at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:272)
at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:235)
at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262)
at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104)
at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5221)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:727)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1775)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:291)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:483)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:291)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

maven test 结果异常

Describe the bug
maven test result
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

MetricHttpServer 线程

Describe the bug
MetricHttpServer 在新的线程中启动
业务线程启动失败的时候,JVM未退出

暂时不支持JDK17

JDk17运行会抛出异常
Exception in thread "MetricHttpServer" java.lang.NoClassDefFoundError: com/sun/net/httpserver/HttpServer
找不到类定义

使用K2 编译器

Is your feature request related to a problem? Please describe.
更新Kotlin 编译器版本,使用最新的K2编译器

使用Gradle构建

Is your feature request related to a problem? Please describe.
使用Gradle构建

暂不支持Kotlin运行

Caused by: java.lang.NullPointerException: Unit::class.java.classLoader must not be null
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.RuntimeModuleData$Companion.create(RuntimeModuleData.kt:35) ~[na:na]
at kotlin.reflect.jvm.internal.ModuleByClassLoaderKt.getOrCreateModule(moduleByClassLoader.kt:58) ~[na:na]
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:36) ~[na:na]
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:35) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32) ~[na:na]
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data.getModuleData(KDeclarationContainerImpl.kt:35) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:50) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:48) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt:48) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:182) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl.getConstructorDescriptors(KClassImpl.kt:199) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$constructors$2.invoke(KClassImpl.kt:94) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$constructors$2.invoke(KClassImpl.kt:93) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.getConstructors(KClassImpl.kt:93) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl.getConstructors(KClassImpl.kt:238) ~[na:na]
at kotlin.reflect.jvm.ReflectJvmMapping.getKotlinFunction(ReflectJvmMapping.kt:146) ~[na:na]
at org.springframework.beans.BeanUtils$KotlinDelegate.instantiateClass(BeanUtils.java:875) ~[spring-beans-5.3.26.jar:5.3.26]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:196) ~[spring-beans-5.3.26.jar:5.3.26]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:146) ~[spring-beans-5.3.26.jar:5.3.26]
at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.registerWellKnownModulesIfAvailable(Jackson2ObjectMapperBuilder.java:883) ~[spring-web-5.3.26.jar:5.3.26]
at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(Jackson2ObjectMapperBuilder.java:717) ~[spring-web-5.3.26.jar:5.3.26]
at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build(Jackson2ObjectMapperBuilder.java:700) ~[spring-web-5.3.26.jar:5.3.26]
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.(MappingJackson2HttpMessageConverter.java:59) ~[spring-web-5.3.26.jar:5.3.26]
at org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter.(AllEncompassingFormHttpMessageConverter.java:94) ~[spring-web-5.3.26.jar:5.3.26]
at org.springframework.web.filter.FormContentFilter.(FormContentFilter.java:61) ~[spring-web-5.3.26.jar:5.3.26]
at org.springframework.boot.web.servlet.filter.OrderedFormContentFilter.(OrderedFormContentFilter.java:29) ~[spring-boot-2.7.10.jar:2.7.10]
at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.formContentFilter(WebMvcAutoConfiguration.java:177) ~[spring-boot-autoconfigure-2.7.10.jar:2.7.10]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_361]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_361]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_361]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_361]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.26.jar:5.3.26]
... 57 common frames omitted

[Byte Buddy] ERROR java.util.concurrent.ThreadPoolExecutor [null, null, loaded=true]

[Byte Buddy] ERROR java.util.concurrent.ThreadPoolExecutor [null, null, loaded=true]
java.lang.AbstractMethodError: minxie.space.thread.JdkThreadPoolAgent$$Lambda$3/1300393335.transform(Lnet/bytebuddy/dynamic/DynamicType$Builder;Lnet/bytebuddy/description/type/TypeDescription;Ljava/lang/ClassLoader;Lnet/bytebuddy/utility/JavaModule;)Lnet/bytebuddy/dynamic/DynamicType$Builder;
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:10436)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:10377)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1600(AgentBuilder.java:10140)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:10759)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:10706)
at java.security.AccessController.doPrivileged(Native Method)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:10297)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Dispatcher$ForJava6CapableVm.retransformClasses(AgentBuilder.java:6977)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector$ForRetransformation.doApply(AgentBuilder.java:7256)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector.apply(AgentBuilder.java:7101)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy.apply(AgentBuilder.java:4937)
at net.bytebuddy.agent.builder.AgentBuilder$Default.doInstall(AgentBuilder.java:9574)
at net.bytebuddy.agent.builder.AgentBuilder$Default.installOn(AgentBuilder.java:9495)
at net.bytebuddy.agent.builder.AgentBuilder$Default$Delegator.installOn(AgentBuilder.java:11097)
at minxie.space.thread.JdkThreadPoolAgent.premain(JdkThreadPoolAgent.kt:27)
at minxie.space.thread.ThreadPoolAgent.premain(ThreadPoolAgent.kt:11)
at minxie.space.agent.AgentMain.premain(AgentMain.kt:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)

Redis连接池监控

Is your feature request related to a problem? Please describe.
Redis连接池监控

引用优化

Is your feature request related to a problem? Please describe.
minxie.space.metrics.core.thread.ThreadPoolContext 会引用线程池,直到程序结束才释放。
可能会导致内存泄露

对监控项进行配置

  • 运行中发现 线程监控是比较影响性能的,将控制权下发给用户进行权衡

gc日志监控

在问题的排查、应用性能优化中
发现分析应用的stop the world、full原因等是很有决策性帮助的

  • stw
  • full gc

dubbo线程池命名优化

Is your feature request related to a problem? Please describe.
在应用重启时,dubbo线程池的监控会多很多无用的面板

Describe the solution you'd like
dubbo线程池的命名兼容应用重启,而实例id可以作为指标名称

基准测试引入

鉴于在生产中运行发现 线程的监控是比较影响性能的
后面引入基准测试对每一项的监控做性能的测试,并作为一个参考配置项

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.