initialize.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* eslint-disable no-console */
  2. /**
  3. * This module initializes the metrics module. It should be imported once
  4. * before any other module to support code instrumentation.
  5. */
  6. const APP_NAME = process.env.METRICS_APP_NAME || 'unknown'
  7. const BUILD_VERSION = process.env.BUILD_VERSION
  8. const ENABLE_PROFILE_AGENT = process.env.ENABLE_PROFILE_AGENT === 'true'
  9. const GCP_OPENTELEMETRY = process.env.GCP_OPENTELEMETRY === 'true'
  10. const JAEGER_OPENTELEMETRY = process.env.JAEGER_OPENTELEMETRY === 'true'
  11. console.log('Initializing metrics')
  12. if (GCP_OPENTELEMETRY || JAEGER_OPENTELEMETRY) {
  13. initializeOpenTelemetryInstrumentation()
  14. initializeOpenTelemetryLogging()
  15. }
  16. if (ENABLE_PROFILE_AGENT) {
  17. initializeProfileAgent()
  18. }
  19. initializePrometheus()
  20. initializePromWrapper()
  21. recordProcessStart()
  22. function initializeOpenTelemetryInstrumentation() {
  23. console.log('Starting OpenTelemetry instrumentation')
  24. const opentelemetry = require('@opentelemetry/sdk-node')
  25. const {
  26. getNodeAutoInstrumentations,
  27. } = require('@opentelemetry/auto-instrumentations-node')
  28. const { Resource } = require('@opentelemetry/resources')
  29. const {
  30. SemanticResourceAttributes,
  31. } = require('@opentelemetry/semantic-conventions')
  32. const resource = new Resource({
  33. [SemanticResourceAttributes.SERVICE_NAME]: APP_NAME,
  34. [SemanticResourceAttributes.SERVICE_NAMESPACE]: 'Overleaf',
  35. 'host.type': 'VM',
  36. })
  37. let exporter
  38. if (GCP_OPENTELEMETRY) {
  39. const GCP = require('@google-cloud/opentelemetry-cloud-trace-exporter')
  40. exporter = new GCP.TraceExporter()
  41. } else if (JAEGER_OPENTELEMETRY) {
  42. const {
  43. OTLPTraceExporter,
  44. } = require('@opentelemetry/exporter-trace-otlp-http')
  45. exporter = new OTLPTraceExporter({
  46. url: `http://${process.env.JAEGER_HOST || 'jaeger'}:4318/v1/traces`,
  47. })
  48. } else {
  49. return
  50. }
  51. const sdk = new opentelemetry.NodeSDK({
  52. traceExporter: exporter,
  53. logger: console,
  54. instrumentations: [getNodeAutoInstrumentations()],
  55. resource,
  56. })
  57. sdk.start()
  58. }
  59. function initializeOpenTelemetryLogging() {
  60. const {
  61. diag,
  62. DiagConsoleLogger,
  63. DiagLogLevel,
  64. } = require('@opentelemetry/api')
  65. diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO)
  66. }
  67. function initializeProfileAgent() {
  68. console.log('Starting Google Profile Agent')
  69. const profiler = require('@google-cloud/profiler')
  70. profiler.start({
  71. serviceContext: {
  72. service: APP_NAME,
  73. version: BUILD_VERSION,
  74. },
  75. })
  76. }
  77. function initializePrometheus() {
  78. const os = require('node:os')
  79. const promClient = require('prom-client')
  80. promClient.register.setDefaultLabels({ app: APP_NAME, host: os.hostname() })
  81. promClient.collectDefaultMetrics({ timeout: 5000, prefix: '' })
  82. }
  83. function initializePromWrapper() {
  84. const promWrapper = require('./prom_wrapper')
  85. promWrapper.setupSweeping()
  86. }
  87. function recordProcessStart() {
  88. const metrics = require('.')
  89. metrics.inc('process_startup')
  90. }