blob: deb26417c0ad778670afa47c9c94ff55051a3851 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.metrics.messagehistory;
import java.util.concurrent.TimeUnit;
import javax.management.MBeanServer;
import com.codahale.metrics.JmxReporter;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.json.MetricsModule;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.StaticService;
import org.apache.camel.api.management.ManagedResource;
import org.apache.camel.component.metrics.MetricsComponent;
import org.apache.camel.spi.ManagementAgent;
import org.apache.camel.spi.Registry;
import org.apache.camel.support.service.ServiceSupport;
/**
* Service holding the {@link MetricsMessageHistory} which registers all message history metrics.
*/
@ManagedResource(description = "MetricsMessageHistory")
public final class MetricsMessageHistoryService extends ServiceSupport implements CamelContextAware, StaticService, MetricsMessageHistoryMBean {
private CamelContext camelContext;
private MetricRegistry metricsRegistry;
private JmxReporter reporter;
private boolean useJmx;
private String jmxDomain = "org.apache.camel.metrics";
private boolean prettyPrint;
private TimeUnit rateUnit = TimeUnit.SECONDS;
private TimeUnit durationUnit = TimeUnit.MILLISECONDS;
private transient ObjectMapper mapper;
private transient ObjectMapper secondsMapper;
public MetricRegistry getMetricsRegistry() {
return metricsRegistry;
}
public void setMetricsRegistry(MetricRegistry metricsRegistry) {
this.metricsRegistry = metricsRegistry;
}
@Override
public CamelContext getCamelContext() {
return camelContext;
}
@Override
public void setCamelContext(CamelContext camelContext) {
this.camelContext = camelContext;
}
public boolean isUseJmx() {
return useJmx;
}
public void setUseJmx(boolean useJmx) {
this.useJmx = useJmx;
}
public String getJmxDomain() {
return jmxDomain;
}
public void setJmxDomain(String jmxDomain) {
this.jmxDomain = jmxDomain;
}
public boolean isPrettyPrint() {
return prettyPrint;
}
public void setPrettyPrint(boolean prettyPrint) {
this.prettyPrint = prettyPrint;
}
public TimeUnit getRateUnit() {
return rateUnit;
}
public void setRateUnit(TimeUnit rateUnit) {
this.rateUnit = rateUnit;
}
public TimeUnit getDurationUnit() {
return durationUnit;
}
public void setDurationUnit(TimeUnit durationUnit) {
this.durationUnit = durationUnit;
}
@Override
protected void doStart() throws Exception {
if (metricsRegistry == null) {
Registry camelRegistry = getCamelContext().getRegistry();
metricsRegistry = camelRegistry.lookupByNameAndType(MetricsComponent.METRIC_REGISTRY_NAME, MetricRegistry.class);
// create a new metricsRegistry by default
if (metricsRegistry == null) {
metricsRegistry = new MetricRegistry();
}
}
if (useJmx) {
ManagementAgent agent = getCamelContext().getManagementStrategy().getManagementAgent();
if (agent != null) {
MBeanServer server = agent.getMBeanServer();
if (server != null) {
reporter = JmxReporter.forRegistry(metricsRegistry).registerWith(server).inDomain(jmxDomain).build();
reporter.start();
}
} else {
throw new IllegalStateException("CamelContext has not enabled JMX");
}
}
// json mapper
this.mapper = new ObjectMapper().registerModule(new MetricsModule(getRateUnit(), getDurationUnit(), false));
if (getRateUnit() == TimeUnit.SECONDS && getDurationUnit() == TimeUnit.SECONDS) {
// they both use same units so reuse
this.secondsMapper = this.mapper;
} else {
this.secondsMapper = new ObjectMapper().registerModule(new MetricsModule(TimeUnit.SECONDS, TimeUnit.SECONDS, false));
}
}
@Override
protected void doStop() throws Exception {
if (reporter != null) {
reporter.stop();
reporter = null;
}
}
@Override
public String dumpStatisticsAsJson() {
ObjectWriter writer = mapper.writer();
if (isPrettyPrint()) {
writer = writer.withDefaultPrettyPrinter();
}
try {
return writer.writeValueAsString(getMetricsRegistry());
} catch (JsonProcessingException e) {
throw RuntimeCamelException.wrapRuntimeCamelException(e);
}
}
@Override
public String dumpStatisticsAsJsonTimeUnitSeconds() {
ObjectWriter writer = secondsMapper.writer();
if (isPrettyPrint()) {
writer = writer.withDefaultPrettyPrinter();
}
try {
return writer.writeValueAsString(getMetricsRegistry());
} catch (JsonProcessingException e) {
throw RuntimeCamelException.wrapRuntimeCamelException(e);
}
}
@Override
public void reset() {
// remove all
metricsRegistry.removeMatching(new MetricFilter() {
@Override
public boolean matches(String name, Metric metric) {
return true;
}
});
}
}