aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/trace/GoogleStackdriverTrace.scala
blob: 1ff8d10ea04a9b87674c93148b4ad4b59248d773 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package xyz.driver.core.trace

import java.io.FileInputStream
import java.nio.file.{Files, Paths}
import java.util

import akka.http.scaladsl.model.HttpRequest
import com.google.auth.oauth2.GoogleCredentials
import com.google.cloud.trace.grpc.v1.GrpcTraceConsumer
import com.google.cloud.trace.v1.consumer.TraceConsumer
import com.typesafe.scalalogging.Logger

final class GoogleStackdriverTrace(projectId: String,
                                   clientSecretsFile: String,
                                   appName: String,
                                   appEnvironment: String,
                                   log: Logger)
    extends GoogleServiceTracer {

  // initialize our various tracking storage systems
  private val clientSecretsInputStreamOpt: Option[FileInputStream] = if (Files.exists(Paths.get(clientSecretsFile))) {
    Some(new FileInputStream(clientSecretsFile))
  } else {
    None
  }
  // if the google credentials are invalid, just log the traces
  private val traceConsumer: TraceConsumer = clientSecretsInputStreamOpt.fold[TraceConsumer] {
    log.warn(s"Google credentials not found in path: $clientSecretsFile")
    new LoggingTraceConsumer(log)
  } { clientSecretsInputStream =>
    GrpcTraceConsumer
      .create(
        "cloudtrace.googleapis.com",
        GoogleCredentials
          .fromStream(clientSecretsInputStream)
          .createScoped(util.Arrays.asList("https://www.googleapis.com/auth/trace.append"))
      )
  }

  private val googleServiceTracer =
    new GoogleStackdriverTraceWithConsumer(projectId, appName, appEnvironment, traceConsumer)

  override def startSpan(httpRequest: HttpRequest): GoogleStackdriverTraceSpan =
    googleServiceTracer.startSpan(httpRequest)

  override def endSpan(span: GoogleStackdriverTraceSpan): Unit = googleServiceTracer.endSpan(span)
}