001/*
002 * Copyright 2012-2018 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.boot.actuate.autoconfigure.metrics;
018
019import ch.qos.logback.classic.LoggerContext;
020import io.micrometer.core.instrument.MeterRegistry;
021import io.micrometer.core.instrument.binder.logging.LogbackMetrics;
022import org.slf4j.ILoggerFactory;
023import org.slf4j.LoggerFactory;
024
025import org.springframework.boot.actuate.autoconfigure.metrics.LogbackMetricsAutoConfiguration.LogbackLoggingCondition;
026import org.springframework.boot.autoconfigure.AutoConfigureAfter;
027import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
028import org.springframework.boot.autoconfigure.condition.ConditionMessage;
029import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
030import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
031import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
032import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
033import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
034import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
035import org.springframework.context.annotation.Bean;
036import org.springframework.context.annotation.ConditionContext;
037import org.springframework.context.annotation.Conditional;
038import org.springframework.context.annotation.Configuration;
039import org.springframework.core.type.AnnotatedTypeMetadata;
040
041/**
042 * {@link EnableAutoConfiguration Auto-configuration} for Logback metrics.
043 *
044 * @author Stephane Nicoll
045 * @since 2.1.0
046 */
047@Configuration
048@AutoConfigureAfter(MetricsAutoConfiguration.class)
049@ConditionalOnClass({ MeterRegistry.class, LoggerContext.class, LoggerFactory.class })
050@ConditionalOnBean(MeterRegistry.class)
051@Conditional(LogbackLoggingCondition.class)
052@ConditionalOnProperty(value = "management.metrics.binders.logback.enabled", matchIfMissing = true)
053public class LogbackMetricsAutoConfiguration {
054
055        @Bean
056        @ConditionalOnMissingBean
057        public LogbackMetrics logbackMetrics() {
058                return new LogbackMetrics();
059        }
060
061        static class LogbackLoggingCondition extends SpringBootCondition {
062
063                @Override
064                public ConditionOutcome getMatchOutcome(ConditionContext context,
065                                AnnotatedTypeMetadata metadata) {
066                        ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
067                        ConditionMessage.Builder message = ConditionMessage
068                                        .forCondition("LogbackLoggingCondition");
069                        if (loggerFactory instanceof LoggerContext) {
070                                return ConditionOutcome.match(
071                                                message.because("ILoggerFactory is a Logback LoggerContext"));
072                        }
073                        return ConditionOutcome
074                                        .noMatch(message.because("ILoggerFactory is an instance of "
075                                                        + loggerFactory.getClass().getCanonicalName()));
076                }
077
078        }
079
080}