All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openqa.selenium.remote.tracing.DistributedTracer Maven / Gradle / Ivy

Go to download

Selenium automates browsers. That's it! What you do with that power is entirely up to you.

There is a newer version: 4.0.0-alpha-2
Show newest version
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

package org.openqa.selenium.remote.tracing;

import io.opentracing.contrib.tracerresolver.TracerResolver;
import io.opentracing.noop.NoopTracerFactory;

import java.util.Map;
import java.util.Objects;
import java.util.function.Function;

/**
 * Represents an entry point for accessing all aspects of distributed tracing.
 */
public interface DistributedTracer {

  static Builder builder() {
    return new Builder();
  }

  /**
   * A distributed trace is made of a series of {@link Span}s, which are either
   * independent or have a parent/child relationship. Creating a span will make
   * it the currently active {@code Span}, as returned by
   * {@link #getActiveSpan()}.
   *
   * @param parent The parent span. If this is {@code null}, then the span is
   *               assumed to be independent.
   */
  Span createSpan(String operation, Span parent);

  /**
   * Create a span from a remote context of some type, which will generally be
   * an {@link org.openqa.selenium.remote.http.HttpRequest}.
   */
   Span createSpan(String operationName, C carrier, Function> extractor);

  /**
   * Get the currently active span, which may be {@code null}.
   */
  Span getActiveSpan();


  class Builder {

    private DistributedTracer tracer;

    private Builder() {
      // Only accessible through the parent class

      this.tracer = new OpenTracingTracer(NoopTracerFactory.create());
    }

    public Builder use(io.opentracing.Tracer openTracingTracer) {
      Objects.requireNonNull(openTracingTracer, "Tracer must be set.");
      tracer = new OpenTracingTracer(openTracingTracer);
      return this;
    }

    public Builder detect() {
      // Checking the global tracer is futile --- it defaults to a no-op instance.
      try {
        this.tracer = new OpenTracingTracer(TracerResolver.resolveTracer());
      } catch (Throwable e) {
        // Fine. Leave the tracer as it is.
      }

      return this;
    }

    public DistributedTracer build() {
      return tracer;
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy