MCPcopy Index your code
hub / github.com/dimovelev/metrics-sampler

github.com/dimovelev/metrics-sampler @v0.9.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.9.1 ↗ · + Follow
1,676 symbols 4,703 edges 284 files 165 documented · 10%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Build Status

Overview

metrics-sampler is a java program which regularly queries metrics from a configured set of inputs, selects and renames them using regular expressions and sends them to a configured set of outputs. It supports JMX and JDBC as inputs and Graphite as output out of the box. Writing new extensions containing new inputs, outputs, samplers and selectors is pretty straight-forward.

Example Configuration

Check out the following configuration as a quick-start: ```xml

<includes>

    <include location="selectors/*.xml" />
</includes>


<shared-resources>

    <thread-pool name="samplers" size="10" />

    <thread-pool name="custom.samplers" size="2" />

    <jdbc-connection-pool name="oracle01" url="jdbc:oracle:thin:@//oracle1.metrics-sampler.org:1521/EXAMPLE" username="user" password="password" driver="oracle.jdbc.OracleDriver" min-size="1" max-size="5" />
</shared-resources>

<inputs>

    <jmx name="wls-template" template="true" username="admin" password="weblogic1" provider-packages="weblogic.management.remote" persistent-connection="true">

        <ignore-object-names>
            <ignore-object-name regexp="^com\.oracle\.jrockit:type=Flight.+" />
        </ignore-object-names>

        <connection-properties>
            <entry key="jmx.remote.x.request.waiting.timeout" value="100" />
        </connection-properties>

        <socket-options connect-timeout="100" so-timeout="200" keep-alive="false" send-buffer-size="16384" receive-buffer-size="16384" />

        <variables>
            <string name="tomcat.port" value="8080" /> 
        </variables>
    </jmx>


    <jmx name="wls01" url="service:jmx:t3://weblogic1.metrics-sampler.org:6001/jndi/weblogic.management.mbeanservers.runtime" parent="wls-template" />
    <jmx name="wls02" url="service:jmx:t3://weblogic2.metrics-sampler.org:6001/jndi/weblogic.management.mbeanservers.runtime" parent="wls-template" />


    <jmx name="tomcat01" url="service:jmx:rmi:///jndi/rmi://tomcat.metrics-sampler.org:7001/jmxrmi" persistent-connection="true" />


    <jdbc name="oracle01" pool="oracle01">
        <query>select replace(T2.host_name||'.'||T2.instance_name||'.'||replace(replace(replace(replace(metric_name,'/',''),'%','Perc'),'(',''),')',''),' ','_') as metric, value, (25200 + round((end_time - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400),0))*1000 as dt from gv$sysmetric T1, gv$instance T2 where T1.intsize_csec between 1400 and 1600 and T1.inst_id = T2.INST_ID</query>
    </jdbc>


    <apache-status name="apache01" url="http://apache1.metrics-sampler.org:80/qos-viewer?auto" username="user" password="pass" />


    <redis name="redis" host="redis.metrics-sampler.org" port="6379">
        <commands>

            <redis-hlen database="0" key="hash1" />
            <redis-llen key="list1" />
        </commands>
    </redis>


    <oracle-nosql name="oracle-nosql" hosts="kv1.metrics-sampler.org:5000 kv2.metrics-sampler.org:5000 kv3.metrics-sampler.org:5000 kv4.metrics-sampler.org:5000" />


    <webmethods name="webmethods1" url="http://webmethods1.example.com:1234/invoke/wm.server.admin/getDiagnosticData" username="user" password="pass" max-entry-size="10000000" date-format="yyyy-MM-dd HH:mm:ss z" />


    <self name="self" />


    <exec name="exec1" command="cmd">
        <arguments>
            <argument>/C</argument>
            <argument>echo %METRIC%=28</argument>
        </arguments>
        <environment>
            <entry key="METRIC" value="a.b.c" />
        </environment>
    </exec>

    <http name="http1" url="http://localhost/query_metrics.php?format=csv" username="user" password="pass">
        <regexp-response-parser>

            <regexp-line-format expression="\s*(\S+)\s*=\s*(\S+)\s*" name-index="1" value-index="2" />
            <regexp-line-format expression="\s*(\S+)\s*:\s*(\S+)\s*" name-index="1" value-index="2" />
        </regexp-response-parser>
    </http>
</inputs>
<outputs>

    <console name="console" />

    <graphite name="graphite" host="graphite.metrics-sampler.org" port="2003" default="true" />
</outputs>


<variables>
    <string name="tomcat.port" value="8080" />
</variables>


<selector-groups>
    <selector-group name="wls">

        <regexp from-name="com\.bea:Name=DataSource_(.+),ServerRuntime=.+,Type=JDBCOracleDataSourceRuntime\.(ActiveConnectionsAverageCount|ActiveConnectionsCurrentCount|ActiveConnectionsHighCount|ConnectionDelayTime|ConnectionsTotalCount|CurrCapacity|CurrCapacityHighCount|FailuresToReconnectCount|HighestNumAvailable|HighestNumUnavailable|LeakedConnectionCount|NumAvailable|NumUnavailable|ReserveRequestCountWaitSecondsHighCount|WaitingForConnection.*)" to-name="${prefix}.jdbc.${name[1]}.${name[2]}" />
        <regexp from-name="com\.bea:Name=JTARuntime,ServerRuntime=.*,Type=JTARuntime\.(.*TotalCount)" to-name="${prefix}.jta.${name[1]}" />
        <regexp from-name="com\.bea:Name=ThreadPoolRuntime,ServerRuntime=.*,Type=ThreadPoolRuntime\.(CompletedRequestCount|ExecuteThreadIdleCount|ExecuteThreadTotalCount|HoggingThreadCount|MinThreadsConstraintsCompleted|MinThreadsConstraintsPending|PendingUserRequestCount|QueueLength|SharedCapacityForWorkManagers|StandbyThreadCount|Throughput)" to-name="${prefix}.threads.${name[1]}"/>
        <regexp from-name="com\.bea:Name=.*,ServerRuntime=.*,Type=JRockitRuntime\.(JvmProcessorLoad|TotalGarbageCollectionCount|TotalGarbageCollectionTime|FreePhysicalMemory|UsedPhysicalMemory|Uptime)" to-name="${prefix}.jrockit.${name[1]}" />
    </selector-group>
    <selector-group name="tomcat">

        <regexp from-name="Catalina:type=GlobalRequestProcessor,name=http-${tomcat.port}.\.(requestCount|bytesSent|bytesReceived)" to-name="${prefix}.http.${name[1]}"/>
    </selector-group>
    <selector-group name="mod_qos">
        <regexp from-name=".*,metric=([^,]+),path=/([^.]+)\.(current|limit)" to-name="${prefix}.${name[2]}.${name[1]}.${name[3]}"/>
        <regexp from-name=".*,metric=([^,]+)$" to-name="${prefix}.${name[1]}"/>
        <regexp from-name=".*,metric=([^,]+)\.(current|limit)" to-name="${prefix}.${name[1]}.${name[2]}"/>
    </selector-group>
</selector-groups>


<samplers>

    <sampler name="wls" template="true" interval="10" reset-timeout="60">
        <selectors>
            <use-group name="wls" />
        </selectors>

        <variables>
            <string name="prefix" value="backend.${input.name}" />
        </variables>
        <value-transformers>

            <el-value-transformer name=".*\.jrockit\.gc.*\.(pauseTime|time)" expression="value / 1000000" />
        </value-transformers>
    </sampler>


    <sampler input="wls01" parent="wls" />
    <sampler input="wls02" parent="wls" />

    <sampler input="tomcat01" interval="10">
        <variables>
            <string name="prefix" value="frontend.${input.name}" />

            <string name="tomcat.port" value="9080" />
        </variables>
        <selectors>
            <use-group name="tomcat" />
        </selectors>
    </sampler>

    <!-- Setting quiet to true causes the sampler to log connection problems using debug level - thus preventing the problem 
         to be logged in the standard configuration. This is useful if the input is a source that is not always available but 
         you want

Extension points exported contracts — how you extend this code

BulkMetricsReader (Interface)
A reader that can fetch all metrics' names and values at once. [7 implementers]
metrics-sampler-core/src/main/java/org/metricssampler/reader/BulkMetricsReader.java
StatusLineParser (Interface)
A parser that can parse a single line of the response [16 implementers]
metrics-sampler-extension-apache-status/src/main/java/org/metricssampler/extensions/apachestatus/parsers/StatusLineParser.java
HttpResponseParser (Interface)
(no doc) [14 implementers]
metrics-sampler-extension-http/src/main/java/org/metricssampler/extensions/http/HttpResponseParser.java
ControlCommand (Interface)
(no doc) [6 implementers]
metrics-sampler-core/src/main/java/org/metricssampler/daemon/commands/ControlCommand.java
SharedResource (Interface)
A resource that can be used by multiple components. [3 implementers]
metrics-sampler-core/src/main/java/org/metricssampler/resources/SharedResource.java
LocalObjectFactory (Interface)
A factory intended to be implemented by extensions. [2 implementers]
metrics-sampler-core/src/main/java/org/metricssampler/service/LocalObjectFactory.java
MetricName (Interface)
(no doc) [4 implementers]
metrics-sampler-core/src/main/java/org/metricssampler/reader/MetricName.java

Core symbols most depended-on inside this repo

getName
called by 137
metrics-sampler-core/src/main/java/org/metricssampler/service/Extension.java
get
called by 84
metrics-sampler-core/src/main/java/org/metricssampler/reader/Metrics.java
add
called by 72
metrics-sampler-extension-jmx/src/main/java/org/metricssampler/extensions/jmx/PropertyPath.java
size
called by 61
metrics-sampler-core/src/main/java/org/metricssampler/reader/Metrics.java
checkArgumentNotNull
called by 39
metrics-sampler-core/src/main/java/org/metricssampler/util/Preconditions.java
getValue
called by 33
metrics-sampler-extension-jmx/src/main/java/org/metricssampler/extensions/jmx/PathSegment.java
isEmpty
called by 29
metrics-sampler-core/src/main/java/org/metricssampler/reader/Metrics.java
notEmpty
called by 27
metrics-sampler-core/src/main/java/org/metricssampler/config/loader/xbeans/ValidationUtils.java

Shape

Method 1,385
Class 269
Interface 22

Languages

Java100%

Modules by API surface

metrics-sampler-extension-base/src/main/java/org/metricssampler/extensions/base/DefaultSamplerXBean.java24 symbols
metrics-sampler-core/src/main/java/org/metricssampler/config/loader/FileGlob.java24 symbols
metrics-sampler-core/src/main/java/org/metricssampler/config/loader/xbeans/ConfigurationXBean.java23 symbols
metrics-sampler-extension-base/src/main/java/org/metricssampler/extensions/base/DefaultSampler.java22 symbols
metrics-sampler-core/src/main/java/org/metricssampler/config/loader/xbeans/BaseHttpInputXBean.java22 symbols
metrics-sampler-extension-jmx/src/main/java/org/metricssampler/extensions/jmx/JmxInputXBean.java21 symbols
metrics-sampler-core/src/main/java/org/metricssampler/service/DefaultBootstrapper.java21 symbols
metrics-sampler-core/src/main/java/org/metricssampler/service/AbstractLocalObjectFactory.java21 symbols
metrics-sampler-core/src/main/java/org/metricssampler/resources/SamplerStats.java21 symbols
metrics-sampler-extension-jmx/src/main/java/org/metricssampler/extensions/jmx/JmxMetricsReader.java20 symbols
metrics-sampler-extension-jdbc/src/main/java/org/metricssampler/extensions/jdbc/JdbcConnectionPoolXBean.java19 symbols
metrics-sampler-core/src/main/java/org/metricssampler/reader/BaseHttpMetricsReader.java17 symbols

For agents

$ claude mcp add metrics-sampler \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page