AppConfig.java 3.47 KB
package com.tianting.infoloop.config;

import brave.Tracing;
import brave.baggage.BaggagePropagation;
import brave.baggage.BaggagePropagationConfig;
import brave.handler.MutableSpan;
import brave.handler.SpanHandler;
import brave.propagation.B3Propagation;
import brave.propagation.CurrentTraceContext;
import brave.propagation.TraceContext;
import brave.sampler.Sampler;
import com.tianting.infoloop.service.grpc.MealOrderGrpcService;
import com.tianting.infoloop.service.grpc.OrderGrpcService;
import com.tianting.infoloop.service.grpc.OrderSubscriptionMessageGrpcService;
import io.grpc.Server;
import io.grpc.ServerInterceptor;
import io.grpc.ServerInterceptors;
import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;

import static com.tianting.infoloop.constants.ConfigConstants.APP_NAME;
import static com.tianting.infoloop.constants.ConfigConstants.BRAVE_PROPAGATION_DEBUG_FIELD;
import static com.tianting.infoloop.constants.ConfigConstants.SERVICE_PORT;

@Configuration
public class AppConfig implements ApplicationContextAware {
    public static ApplicationContext APP_CONTEXT = null;
    private static final Logger LOGGER = LoggerFactory.getLogger("tracing");

    @Override
    public void setApplicationContext(@NonNull final ApplicationContext applicationContext) {
        APP_CONTEXT = applicationContext;
    }

    @Bean
    Tracing tracing(@Value(APP_NAME) final String serviceName) {
        return Tracing
                .newBuilder()
                .sampler(Sampler.ALWAYS_SAMPLE)
                .localServiceName(serviceName)
                .propagationFactory(BaggagePropagation
                        .newFactoryBuilder(B3Propagation.FACTORY)
                        .add(BaggagePropagationConfig.SingleBaggageField.remote(BRAVE_PROPAGATION_DEBUG_FIELD))
                        .build())
                .currentTraceContext(CurrentTraceContext.Default.create())
                .addSpanHandler(new SpanHandler() {
                    @Override
                    public boolean end(final TraceContext context,
                                       final MutableSpan span,
                                       final Cause cause) {
                        LOGGER.info(span.toString());
                        return true;
                    }
                })
                .build();
    }


    @Bean
    public Server serviceServer(@Value(SERVICE_PORT) final int port,
                                final ServerInterceptor serverInterceptor,
                                final OrderGrpcService orderGrpcService,
                                final MealOrderGrpcService mealOrderGrpcService,
                                final OrderSubscriptionMessageGrpcService orderSubscriptionMessageGrpcService) {
        return NettyServerBuilder
                .forPort(port)
                .addService(ServerInterceptors.intercept(orderGrpcService, serverInterceptor))
                .addService(ServerInterceptors.intercept(mealOrderGrpcService, serverInterceptor))
                .addService(ServerInterceptors.intercept(orderSubscriptionMessageGrpcService, serverInterceptor))
                .build();
    }
}