Skip to content

Commit

Permalink
Refactor metrics (#30)
Browse files Browse the repository at this point in the history
* Refactor metrics

* Make actuator optional

* Use release version
  • Loading branch information
devkanro authored Jun 16, 2020
1 parent ac9ad45 commit 223cc0c
Show file tree
Hide file tree
Showing 31 changed files with 161 additions and 141 deletions.
4 changes: 2 additions & 2 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ plugins {
`java-library`
`kotlin-dsl`
id("idea")
id("com.bybutter.sisyphus.project") version "0.0.2"
id("com.bybutter.sisyphus.project") version "0.0.3"
}

dependencies {
implementation(platform("com.bybutter.sisyphus:sisyphus-dependencies:0.0.2"))
implementation(platform("com.bybutter.sisyphus:sisyphus-dependencies:0.0.3"))
implementation("com.bybutter.sisyphus.tools:sisyphus-protobuf-gradle-plugin")
implementation("com.bybutter.sisyphus.tools:sisyphus-project-gradle-plugin")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin")
Expand Down
4 changes: 0 additions & 4 deletions buildSrc/src/main/kotlin/dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,6 @@ object Dependencies {
const val wagonHttp = "$group.wagon:wagon-http"
}

object Micrometer {
const val prometheus = "io.micrometer:micrometer-registry-prometheus"
}

const val elastic5 = "org.elasticsearch.client:transport"

const val mysql = "mysql:mysql-connector-java"
Expand Down
2 changes: 1 addition & 1 deletion dependencies/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ javaPlatform {
dependencies {
api(platform(project(":sisyphus-bom")))
api(platform("org.springframework.boot:spring-boot-dependencies:2.3.0.RELEASE"))
api(platform("io.micrometer:micrometer-bom:1.5.1"))
api(platform("org.jetbrains.kotlin:kotlin-bom:1.3.72"))
api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.3.7"))
api(platform("org.apache.maven:maven:3.6.3"))
Expand Down Expand Up @@ -50,6 +51,5 @@ dependencies {
api("org.eclipse.jgit:org.eclipse.jgit:5.7.0.202003110725-r")
api("com.palantir.gradle.docker:gradle-docker:0.25.0")
api("io.grpc:grpc-kotlin-stub:0.1.2")
api("io.micrometer:micrometer-registry-prometheus:1.5.1")
}
}
3 changes: 1 addition & 2 deletions starter/sisyphus-grpc-server-starter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ dependencies {
api(project(":middleware:sisyphus-grpc-client"))
api(project(":middleware:sisyphus-configuration-artifact"))
implementation(Dependencies.Grpc.stub)
implementation(Dependencies.Spring.Boot.actuator)
implementation(Dependencies.Micrometer.prometheus)
compileOnly(Dependencies.Spring.Boot.actuator)
runtimeOnly(Dependencies.Grpc.netty)
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ package com.bybutter.sisyphus.starter.grpc
import com.bybutter.sisyphus.middleware.grpc.RpcServiceImpl
import com.bybutter.sisyphus.rpc.GrpcServerConstants
import com.bybutter.sisyphus.spring.BeanUtils
import com.bybutter.sisyphus.starter.grpc.support.ReflectionService
import com.bybutter.sisyphus.starter.grpc.support.ReflectionServiceAlpha
import com.bybutter.sisyphus.starter.grpc.support.RpcBinaryLog
import com.bybutter.sisyphus.starter.grpc.support.reflection.ReflectionService
import com.bybutter.sisyphus.starter.grpc.support.reflection.ReflectionServiceAlpha
import io.grpc.BindableService
import io.grpc.Server
import io.grpc.ServerBuilder
Expand Down Expand Up @@ -66,7 +65,6 @@ class ServiceRegistrar : BeanDefinitionRegistryPostProcessor, EnvironmentAware {
builder = builder.addStreamTracerFactory(factory)
}

builder.setBinaryLog(RpcBinaryLog())
builder.addService(ReflectionServiceAlpha())
builder.addService(ReflectionService())

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.bybutter.sisyphus.starter.grpc.support.metrics

import com.bybutter.sisyphus.starter.grpc.support.REQUEST_TIMESTAMP_CONTEXT_KEY
import io.grpc.Context
import io.grpc.Contexts
import io.grpc.ForwardingServerCall
import io.grpc.Metadata
import io.grpc.ServerCall
import io.grpc.ServerCallHandler
import io.grpc.ServerInterceptor
import io.grpc.Status
import io.micrometer.core.instrument.MeterRegistry
import java.time.Duration

/**
* ServerInterceptor for micrometer timers, it will create two times for sisyphus,
* 'sisyphus_grpc_requests' will statistics all requests,
* 'sisyphus_grpc_incoming_requests' will statistics all incoming requests which has 'host' header and not be 'localhost'.
*/
class MicrometerTimerInterceptor(private val registry: MeterRegistry) : ServerInterceptor {
override fun <ReqT : Any, RespT : Any> interceptCall(call: ServerCall<ReqT, RespT>, headers: Metadata, next: ServerCallHandler<ReqT, RespT>): ServerCall.Listener<ReqT> {
val host = headers.get(Metadata.Key.of("host", Metadata.ASCII_STRING_MARSHALLER))?.toString()
return Contexts.interceptCall(Context.current(), ServerMicrometerCall(call, registry, host), headers, next)
}

private class ServerMicrometerCall<ReqT : Any, RespT : Any>(call: ServerCall<ReqT, RespT>, private val registry: MeterRegistry, private val host: String?) : ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {
override fun close(status: Status, trailers: Metadata) {
val costDuration = Duration.ofNanos(System.nanoTime() - REQUEST_TIMESTAMP_CONTEXT_KEY.get())

registry.timer("sisyphus_grpc_requests",
"service", delegate().methodDescriptor.serviceName,
"method", delegate().methodDescriptor.fullMethodName,
"status", status.code.name,
"exception", status.cause?.javaClass?.name ?: "None"
).record(costDuration)

if (host != null && !host.startsWith("localhost")) {
registry.timer("sisyphus_grpc_incoming_requests",
"service", delegate().methodDescriptor.serviceName,
"method", delegate().methodDescriptor.fullMethodName,
"status", status.code.name,
"exception", status.cause?.javaClass?.name ?: "None"
).record(costDuration)
}

super.close(status, trailers)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.bybutter.sisyphus.starter.grpc.support.metrics

import io.micrometer.core.instrument.MeterRegistry
import org.springframework.boot.autoconfigure.AutoConfigureAfter
import org.springframework.boot.autoconfigure.AutoConfigureBefore
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.context.annotation.Bean

@AutoConfigureAfter(name = [
"org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration",
"org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration"
])
@AutoConfigureBefore(name = ["org.springframework.boot.actuate.autoconfigure.metrics.web.reactive.WebFluxMetricsAutoConfiguration"])
@ConditionalOnClass(name = ["io.micrometer.core.instrument.MeterRegistry"])
class SisyphusMetricsAutoConfiguration {
@Bean
fun micrometerInterceptor(registry: MeterRegistry): MicrometerTimerInterceptor {
return MicrometerTimerInterceptor(registry)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.support
package com.bybutter.sisyphus.starter.grpc.support.reflection

import com.bybutter.sisyphus.protobuf.ProtoTypes
import com.bybutter.sisyphus.starter.grpc.support.reflection.v1.ExtensionNumberResponse
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.support
package com.bybutter.sisyphus.starter.grpc.support.reflection

import com.bybutter.sisyphus.protobuf.ProtoTypes
import com.bybutter.sisyphus.starter.grpc.support.reflection.v1alpha.ExtensionNumberResponse
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.bybutter.sisyphus.starter.grpc.SisyphusGrpcServerAutoConfiguration
com.bybutter.sisyphus.starter.grpc.SisyphusGrpcServerAutoConfiguration,\
com.bybutter.sisyphus.starter.grpc.support.metrics.SisyphusMetricsAutoConfiguration
1 change: 1 addition & 0 deletions starter/sisyphus-grpc-transcoding-starter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ dependencies {
api(project(":starter:sisyphus-webflux-starter"))
implementation(Dependencies.Grpc.stub)
implementation(Dependencies.swagger)
compileOnly(Dependencies.Spring.Boot.actuator)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.bybutter.sisyphus.starter.grpc.transcoding

import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.authentication.DefaultSwaggerConfig
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.authentication.DefaultSwaggerConfig
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Import

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.bybutter.sisyphus.starter.grpc.transcoding

import com.bybutter.sisyphus.starter.grpc.ServiceRegistrar
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.SwaggerProperty
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.SwaggerRouterFunction
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.authentication.SwaggerValidate
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.SwaggerProperty
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.SwaggerRouterFunction
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.authentication.SwaggerValidate
import com.bybutter.sisyphus.starter.webflux.CorsConfigurationSourceRegistrar
import io.grpc.Server
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.support.metrics

import org.springframework.boot.actuate.metrics.web.reactive.server.WebFluxTagsContributor
import org.springframework.boot.autoconfigure.AutoConfigureAfter
import org.springframework.boot.autoconfigure.AutoConfigureBefore
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.context.annotation.Bean

@AutoConfigureAfter(name = [
"org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration",
"org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration"
])
@AutoConfigureBefore(name = ["org.springframework.boot.actuate.autoconfigure.metrics.web.reactive.WebFluxMetricsAutoConfiguration"])
@ConditionalOnClass(name = [
"org.springframework.boot.actuate.metrics.web.reactive.server.WebFluxTagsContributor"
])
class GrpcTranscodingMetricsAutoConfiguration {
@Bean
fun grpcTranscodingWebFluxTagsContributor(): WebFluxTagsContributor {
return GrpcTranscodingWebFluxTagsContributor()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.support.metrics

import com.bybutter.sisyphus.api.resource.PathTemplate
import com.bybutter.sisyphus.starter.grpc.transcoding.TranscodingFunctions
import io.grpc.MethodDescriptor
import io.micrometer.core.instrument.Tag
import io.micrometer.core.instrument.Tags
import org.springframework.boot.actuate.metrics.web.reactive.server.WebFluxTagsContributor
import org.springframework.web.server.ServerWebExchange

class GrpcTranscodingWebFluxTagsContributor : WebFluxTagsContributor {
override fun httpRequestTags(exchange: ServerWebExchange, ex: Throwable?): MutableIterable<Tag> {
val methodDescriptor = exchange.getAttribute<MethodDescriptor<*, *>>(TranscodingFunctions.METHOD_DESCRIPTOR_ATTRIBUTE)
val pathTemplate = exchange.getAttribute<PathTemplate>(TranscodingFunctions.MATCHING_PATH_TEMPLATE_ATTRIBUTE)

if (methodDescriptor == null || pathTemplate == null) {
return Tags.of(
"grpc_method", "None",
"grpc_service", "None"
)
}

return Tags.of(
"grpc_method", methodDescriptor.fullMethodName,
"grpc_service", methodDescriptor.serviceName,
"uri", pathTemplate.toString()
)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.swagger
package com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger

import com.bybutter.sisyphus.middleware.configuration.ConfigFormatFilePropertyExporter

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.swagger
package com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger

import io.swagger.v3.oas.models.security.SecurityScheme
import org.springframework.boot.context.properties.ConfigurationProperties
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.swagger
package com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger

import com.bybutter.sisyphus.api.http
import com.bybutter.sisyphus.protobuf.ProtoTypes
import com.bybutter.sisyphus.protobuf.primitives.FieldDescriptorProto
import com.bybutter.sisyphus.protobuf.primitives.ServiceDescriptorProto
import com.bybutter.sisyphus.starter.grpc.transcoding.EmptyRouterFunction
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.authentication.SwaggerValidate
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils.SwaggerDescription
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils.SwaggerParams
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils.SwaggerPaths
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils.SwaggerSchema
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils.SwaggerSecuritySchemes
import com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils.SwaggerServers
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.authentication.SwaggerValidate
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils.SwaggerDescription
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils.SwaggerParams
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils.SwaggerPaths
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils.SwaggerSchema
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils.SwaggerSecuritySchemes
import com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils.SwaggerServers
import com.google.protobuf.DescriptorProtos
import io.grpc.Server
import io.grpc.ServerServiceDefinition
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.swagger.authentication
package com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.authentication

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.context.annotation.Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.swagger.authentication
package com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.authentication

import org.springframework.web.reactive.function.server.ServerRequest

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bybutter.sisyphus.starter.grpc.transcoding.swagger.utils
package com.bybutter.sisyphus.starter.grpc.transcoding.support.swagger.utils

import com.bybutter.sisyphus.collection.contentEquals
import com.bybutter.sisyphus.protobuf.primitives.FileDescriptorProto
Expand Down
Loading

0 comments on commit 223cc0c

Please sign in to comment.