001package io.prometheus.client.examples.guice;
002
003import com.google.inject.Inject;
004import com.google.inject.Singleton;
005import io.prometheus.client.Prometheus;
006import io.prometheus.client.examples.guice.servlet.BarServlet;
007import io.prometheus.client.examples.guice.servlet.FooServlet;
008import io.prometheus.client.utility.servlet.MetricsServlet;
009import org.eclipse.jetty.servlet.ServletContextHandler;
010import org.eclipse.jetty.servlet.ServletHolder;
011
012import java.util.Set;
013
014
015/**
016 * <p>An example encapsulation for a full end-to-end server.</p>
017 */
018@Singleton
019public class Server {
020  private final org.eclipse.jetty.server.Server server;
021  private final FooServlet foo;
022  private final BarServlet bar;
023  private final Set<Prometheus.ExpositionHook> hooks;
024
025  @Inject
026  public Server(org.eclipse.jetty.server.Server server, final FooServlet foo,
027      final BarServlet bar, final Set<Prometheus.ExpositionHook> hooks) {
028    this.server = server;
029    this.foo = foo;
030    this.bar = bar;
031    this.hooks = hooks;
032  }
033
034  /**
035   * <p>
036   * We are optionally demonstrating the ability to dynamically add extra {@link
037   * io.prometheus.client.Prometheus.ExpositionHook} via Guice.  It is possible to add
038   * registrations in static blocks, but here we are using Guice's {@link
039   * com.google.inject.multibindings.Multibinder} capability to provision some hooks.
040   *</p>
041   */
042  public void configure() {
043    for (final Prometheus.ExpositionHook hook : hooks) {
044      Prometheus.defaultAddPreexpositionHook(hook);
045    }
046
047    Prometheus.defaultInitialize();
048
049    final ServletContextHandler context = new ServletContextHandler();
050    context.setContextPath("/");
051    server.setHandler(context);
052    context.addServlet(new ServletHolder(foo), "/foo");
053    context.addServlet(new ServletHolder(bar), "/bar");
054    context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics");
055  }
056
057  public void run() {
058    try {
059      server.start();  // Throws Exception — really?
060      server.join();
061    } catch (final Exception e) {
062      throw new RuntimeException(e);
063    }
064  }
065}