본문 바로가기

배움의 즐거움/프로그래밍

(18) Graphql-ruby - tracing

반응형



Tracing


GraphQL::Tracing 은 GraphQL 런타임 이벤트 관찰을 위한 .trace 후크를 제공한다.

이를 위해 tracer 은 반드시 구현되어야 한다.

class MyCustomTracer
  def self.trace(key, data)
    # key & data 를 이용하여 여기에 구현
    yield
  end
end

.trace 은 다음과 같은 것들과 함께 호출할 수 있다.

  • key: 런타임 동안 발생하는 이벤트
  • data: 이벤트에 관한 메타데이터의 해쉬
  • &block: 이벤트 자신, 이것은 반드시 yield 되어야 하며, 값은 리턴되어야 한다.


모든 쿼리에 대해 tracer를 실행하려면, 스키마에 tracer:추가

# 모든 쿼리에 대해 `MyCustomTracer` 실행
class MySchema < GraphQL::Schema
  tracer(MyCustomTracer)
end


또는, 오직 하나의 쿼리에만 tracer를 실행할 수 있다. 이를 위해서는 context에 tracer을 추가하면 된다.

# 오직 이 쿼리에 대해서만 `MyCustomTracer` 실행
MySchema.execute(..., context: { tracers: [MyCustomTracer]})

모든 이벤트는  GraphQL::Tracing 여기서 확인할 수 있다,


ActiveSupport::Notifications


ActiveSupportNotificationsTracing 를 이용하여 ActiveSupport::Notifications 에 이벤트를 발생할 수 있다.

이를 사용하기 위해서는 다음과 같이 하면 된다.

# ActiveSupport::Notifications 에 실행이벤트 보냄
class MySchema < GraphQL::Schema
  tracer(GraphQL::Tracing::ActiveSupportNotificationsTracing)
end


Monitoring



아래와 같이 다양한 GraphQL-Ruby  외부의 모니터링 플랫폼이 존재한다. Leaf 필드는 모니터링 되지 않는데, 이는 high cardinality 를 피하기 위해서이다. 구현은 Tracing::PlatformTracing 를 기초로 한다. 


Appsignal


AppSignal instrumentation 추가하기:

class MySchema < GraphQL::Schema
  use(GraphQL::Tracing::AppsignalTracing)
end
appsignal monitoring


New Relic


New Relic instrumentation 추가하기:

class MySchema < GraphQL::Schema
  use(GraphQL::Tracing::NewRelicTracing)
  # 선택사항: 새로운 new relic transaction 이름을 설정하기 위해서 operation name을 사용
  # use(GraphQL::Tracing::NewRelicTracing, set_transaction_name: true)
end
new relic monitoring


Scout


Scout APM instrumentation 추가하기:

class MySchema < GraphQL::Schema
  use(GraphQL::Tracing::ScoutTracing)
end
scout monitoring


Skylight


Skylight instrumentation 추가하기:

class MySchema < GraphQL::Schema
  use(GraphQL::Tracing::SkylightTracing)
end
skylight monitoring


Datadog


Datadog instrumentation 추가하기:

class MySchema < GraphQL::Schema
  use(GraphQL::Tracing::DataDogTracing)
end


Prometheus


Prometheus instrumentation 추가하기:

require 'prometheus_exporter/client'

class MySchema < GraphQL::Schema
  use(GraphQL::Tracing::PrometheusTracing)
end

PrometheusExporter 서버는 반드시 GraphQL::Tracing::PrometheusTracing::GraphQLCollector를 extend한 커스텀 타입 컨트롤러와 함께 반드시 실행되어야 한다. 

# lib/graphql_collector.rb

require 'graphql/tracing'

class GraphQLCollector < GraphQL::Tracing::PrometheusTracing::GraphQLCollector
end
bundle exec prometheus_exporter -a lib/graphql_collector.rb



* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.

* 출처: http://graphql-ruby.org/queries/tracing.html


반응형