/*
 * Copyright 2014 Red Hat, Inc.
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *  The Eclipse Public License is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  The Apache License v2.0 is available at
 *  http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.ext.dropwizard.impl;

import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import io.vertx.core.VertxOptions;
import io.vertx.core.file.impl.FileResolver;
import io.vertx.core.json.DecodeException;
import io.vertx.core.json.JsonObject;
import io.vertx.core.impl.logging.Logger;
import io.vertx.core.impl.logging.LoggerFactory;
import io.vertx.core.metrics.MetricsOptions;
import io.vertx.core.spi.VertxMetricsFactory;
import io.vertx.core.spi.metrics.VertxMetrics;
import io.vertx.ext.dropwizard.DropwizardMetricsOptions;
import io.vertx.ext.dropwizard.reporters.JmxReporter;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

Author:Nick Scavelli
/** * @author <a href="mailto:nscavell@redhat.com">Nick Scavelli</a> */
public class VertxMetricsFactoryImpl implements VertxMetricsFactory { static final String BASE_NAME = "vertx"; private Logger logger = LoggerFactory.getLogger(VertxMetricsFactoryImpl.class); @Override public VertxMetrics metrics(VertxOptions options) { MetricsOptions baseOptions = options.getMetricsOptions(); DropwizardMetricsOptions metricsOptions; if (baseOptions instanceof DropwizardMetricsOptions) { metricsOptions = (DropwizardMetricsOptions) baseOptions; } else { metricsOptions = new DropwizardMetricsOptions(baseOptions.toJson()); } MetricRegistry registry = metricsOptions.getMetricRegistry() != null ? metricsOptions.getMetricRegistry() : new MetricRegistry(); boolean shutdown = true; if (metricsOptions.getRegistryName() != null) { MetricRegistry other = SharedMetricRegistries.add(metricsOptions.getRegistryName(), registry); if (other != null) { registry = other; shutdown = false; } } // Check to see if a config file name has been set, and if it has load it and create new options file from it if (metricsOptions.getConfigPath() != null && !metricsOptions.getConfigPath().isEmpty()) { FileResolver resolver = new FileResolver(); JsonObject loadedFromFile; try { loadedFromFile = loadOptionsFile(metricsOptions.getConfigPath(), resolver); } finally { try { resolver.close(); } catch (IOException ignore) { } } if (!loadedFromFile.isEmpty()) { metricsOptions = new DropwizardMetricsOptions(loadedFromFile); } } String baseName = metricsOptions.getBaseName() == null ? BASE_NAME : metricsOptions.getBaseName(); VertxMetricsImpl metrics = new VertxMetricsImpl(registry, shutdown, options, metricsOptions, baseName); // TODO: Probably should consume metrics through MetricsProvider API, and expose as JMXBeans if (metricsOptions.isJmxEnabled()) { String jmxDomain = metricsOptions.getJmxDomain(); if (jmxDomain == null) { jmxDomain = "vertx" + "@" + Integer.toHexString(options.hashCode()); } JmxReporter reporter = JmxReporter.forRegistry(metrics.registry()).inDomain(jmxDomain).build(); metrics.setDoneHandler(v -> reporter.stop()); reporter.start(); } return metrics; } private JsonObject loadOptionsFile(String configPath, FileResolver fileResolver) { File file = fileResolver.resolveFile(configPath); try (Scanner scanner = new Scanner(file)) { scanner.useDelimiter("\\A"); String metricsConfigString = scanner.next(); return new JsonObject(metricsConfigString); } catch (IOException ioe) { logger.error("Error while reading metrics config file", ioe); } catch (DecodeException de) { logger.error("Error while decoding metrics config file into JSON", de); } return new JsonObject(); } @Override public MetricsOptions newOptions() { return newOptions(null); } @Override public MetricsOptions newOptions(JsonObject jsonObject) { return jsonObject == null ? new DropwizardMetricsOptions() : new DropwizardMetricsOptions(jsonObject); } }