All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.fridujo.automocker.base.MockMicrometerGraphite Maven / Gradle / Ivy

The newest version!
package com.github.fridujo.automocker.base;

import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.graphite.GraphiteReporter;
import com.github.fridujo.automocker.api.AfterBeanRegistration;
import com.github.fridujo.automocker.api.AfterBeanRegistrationExecutable;
import com.github.fridujo.automocker.api.ExtendedBeanDefinitionRegistry;
import com.github.fridujo.automocker.api.metrics.GraphiteMock;
import com.github.fridujo.automocker.api.metrics.GraphiteSenderMock;
import com.github.fridujo.automocker.utils.Classes;
import io.micrometer.core.instrument.Clock;
import io.micrometer.graphite.GraphiteConfig;
import io.micrometer.graphite.GraphiteHierarchicalNameMapper;
import io.micrometer.graphite.GraphiteMeterRegistry;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.RootBeanDefinition;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Set;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented

@AfterBeanRegistration(MockMicrometerGraphite.MockGraphiteExecutable.class)
public @interface MockMicrometerGraphite {

    class MockGraphiteExecutable implements AfterBeanRegistrationExecutable {

        @Override
        public void execute(MockMicrometerGraphite annotation, ExtendedBeanDefinitionRegistry extendedBeanDefinitionRegistry) {
            if (Classes.isPresent("io.micrometer.graphite.GraphiteMeterRegistry")) {
                modifyGraphiteMeterRegistryBeanDefinitions(extendedBeanDefinitionRegistry);
            }
        }

        private void modifyGraphiteMeterRegistryBeanDefinitions(ExtendedBeanDefinitionRegistry extendedBeanDefinitionRegistry) {
            Set graphiteSenderBeans = extendedBeanDefinitionRegistry
                .getBeanDefinitionsForClass(GraphiteMeterRegistry.class);
            if (!graphiteSenderBeans.isEmpty()) {
                String graphiteConfigBeanName = extendedBeanDefinitionRegistry.getBeanDefinitionsForClass(GraphiteConfig.class).iterator().next().name();

                String graphiteReporterFactoryBeanName = extendedBeanDefinitionRegistry.registerBeanDefinition(GraphiteReporterFactory.class);
                String graphiteMeterRegistryFactoryBeanName = extendedBeanDefinitionRegistry.registerBeanDefinition(GraphiteMeterRegistryFactory.class);
                graphiteSenderBeans.forEach(meta -> {
                    String graphiteSenderMockBeanName = meta.registerLinkedBeanDefinition(GraphiteSenderMock.class);
                    String metricRegistryBeanName = meta.registerLinkedBeanDefinition(MetricRegistry.class);

                    String graphiteReporterBeanName = "Automocker" + meta.name() + "GraphiteReporter";
                    RootBeanDefinition graphiteReporterBeanDefinition = new RootBeanDefinition(GraphiteReporter.class);
                    graphiteReporterBeanDefinition.setFactoryBeanName(graphiteReporterFactoryBeanName);
                    graphiteReporterBeanDefinition.setFactoryMethodName("createGraphiteReporter");
                    graphiteReporterBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, new RuntimeBeanReference(metricRegistryBeanName));
                    graphiteReporterBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(1, new RuntimeBeanReference(graphiteConfigBeanName));
                    graphiteReporterBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(2, new RuntimeBeanReference(graphiteSenderMockBeanName));
                    extendedBeanDefinitionRegistry.registerBeanDefinition(graphiteReporterBeanName, graphiteReporterBeanDefinition, meta.getBeanQualifiers());

                    String graphiteMockBeanName = "Automocker" + meta.name() + "GraphiteMock";
                    RootBeanDefinition graphiteMockBeanDefinition = new RootBeanDefinition(GraphiteMock.class);
                    graphiteMockBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, new RuntimeBeanReference(graphiteSenderMockBeanName));
                    graphiteMockBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(1, new RuntimeBeanReference(graphiteReporterBeanName));
                    extendedBeanDefinitionRegistry.registerBeanDefinition(graphiteMockBeanName, graphiteMockBeanDefinition, meta.getBeanQualifiers());

                    RootBeanDefinition graphiteMeterRegistryBeanDefinition = new RootBeanDefinition(GraphiteMeterRegistry.class);
                    graphiteMeterRegistryBeanDefinition.setFactoryBeanName(graphiteMeterRegistryFactoryBeanName);
                    graphiteMeterRegistryBeanDefinition.setFactoryMethodName("createGraphiteMeterRegistry");
                    graphiteMeterRegistryBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, new RuntimeBeanReference(metricRegistryBeanName));
                    graphiteMeterRegistryBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(1, new RuntimeBeanReference(graphiteConfigBeanName));
                    graphiteMeterRegistryBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(2, new RuntimeBeanReference(graphiteReporterBeanName));
                    extendedBeanDefinitionRegistry.registerBeanDefinition(meta.name(), graphiteMeterRegistryBeanDefinition, meta.getBeanQualifiers());
                });
            }
        }
    }

    class GraphiteReporterFactory {
        GraphiteReporter createGraphiteReporter(MetricRegistry metricRegistry, GraphiteConfig config, GraphiteSenderMock graphiteSenderMock) {
            return GraphiteReporter
                .forRegistry(metricRegistry)
                .convertRatesTo(config.rateUnits())
                .convertDurationsTo(config.durationUnits())
                .build(graphiteSenderMock);
        }
    }

    class GraphiteMeterRegistryFactory {
        GraphiteMeterRegistry createGraphiteMeterRegistry(MetricRegistry metricRegistry, GraphiteConfig config, GraphiteReporter graphiteReporter) {
            return new GraphiteMeterRegistry(config, Clock.SYSTEM, new GraphiteHierarchicalNameMapper(config.tagsAsPrefix()), metricRegistry, graphiteReporter);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy