blob: 25b4f99f70a21d19572f878a6a276cd73611b2ce [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.geronimo.microprofile.metrics.extension.sigar;
import static org.eclipse.microprofile.metrics.MetricType.GAUGE;
import java.io.File;
import java.lang.annotation.Annotation;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Stream;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterDeploymentValidation;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.BeforeShutdown;
import javax.enterprise.inject.spi.Extension;
import org.eclipse.microprofile.metrics.Gauge;
import org.eclipse.microprofile.metrics.Metadata;
import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.annotation.RegistryType;
public class MicroprofileMetricsSigarRegistrar implements Extension {
private SigarRegistrar registrar;
void afterValidation(@Observes final AfterDeploymentValidation validation,
final BeanManager beanManager) {
final InitSigar initSigar = new InitSigar(findTempDir());
initSigar.ensureSigarIsSetup();
if (!initSigar.isValid()) {
return;
}
final MetricRegistry.Type registryType = MetricRegistry.Type.valueOf(
System.getProperty("geronimo.metrics.sigar.registry.type", "BASE"));
final Set<Bean<?>> beans = beanManager.getBeans(MetricRegistry.class, new RegistryTypeLiteral(registryType));
final MetricRegistry registry = MetricRegistry.class.cast(beanManager.getReference(
beanManager.resolve(beans), MetricRegistry.class, beanManager.createCreationalContext(null)));
registrar = new SigarRegistrar(
def -> registry.register(
new Metadata(def.getName(), def.getDisplayName(), def.getDescription(), GAUGE, def.getUnit()),
(Gauge<Double>) () -> def.getEvaluator().getAsDouble()),
def -> registry.remove(def.getName()));
registrar.start();
}
void beforeShutdown(@Observes final BeforeShutdown beforeShutdown) {
if (registrar == null) {
return;
}
registrar.stop();
}
// let's try some well know temp folders and fallback on java io one
private File findTempDir() {
return new File(
Stream.of(
"geronimo.metrics.sigar.location",
"catalina.base", "catalina.base",
"meecrowave.base", "tomee.base",
"application.base", "application.home")
.map(System::getProperty)
.filter(Objects::nonNull)
.map(File::new)
.filter(File::exists)
.flatMap(root -> Stream.of(
new File(root, "work"),
new File(root, "temp"),
new File(root, "tmp")))
.filter(File::exists)
.findFirst()
.orElseGet(() -> new File(System.getProperty("java.io.tmpdir", "."))),
System.getProperty("geronimo.metrics.sigar.folder", "sigar"));
}
private static class RegistryTypeLiteral implements RegistryType {
private final MetricRegistry.Type type;
private RegistryTypeLiteral(final MetricRegistry.Type registryType) {
this.type = registryType;
}
@Override
public MetricRegistry.Type type() {
return type;
}
@Override
public Class<? extends Annotation> annotationType() {
return RegistryType.class;
}
}
}