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

com.satori.composer.ddog.DdogClient Maven / Gradle / Ivy

package com.satori.composer.ddog;

import com.satori.composer.vertx.*;
import com.satori.mods.core.async.*;

import java.nio.charset.*;
import java.util.*;

import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.datatype.jdk8.*;
import com.fasterxml.jackson.module.afterburner.*;
import io.netty.handler.codec.http.*;
import io.vertx.core.*;
import io.vertx.core.buffer.*;
import io.vertx.core.http.*;
import io.vertx.core.http.HttpHeaders;


public class DdogClient {
  HttpClient http;
  DdogClientConfig config;
  public final ObjectMapper mapper = new ObjectMapper()
    .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    .registerModule(new AfterburnerModule())
    .registerModule(new Jdk8Module());
  
  
  public DdogClient(Vertx vertx, DdogClientConfig config) {
    http = vertx.createHttpClient(new HttpClientOptions()
      .setTryUseCompression(config.compression)
      .setMaxPoolSize(config.maxPoolSize)
      .setIdleTimeout(config.idleTimeout)
      .setSsl(config.ssl)
      .setDefaultHost(config.host)
      .setDefaultPort(config.port)
      .setKeepAlive(true)
      .setPipelining(true)
      .setMaxWaitQueueSize(config.maxWaitQueueSize)
      .setConnectTimeout(config.connectTimeout)
    );
    this.config = config;
  }
  
  private HttpClientRequest createPostRequest(String seg) {
    QueryStringEncoder qenc = new QueryStringEncoder(config.path + seg);
    for (HashMap.Entry e : config.args.entrySet()) {
      qenc.addParam(e.getKey(), e.getValue());
    }
    String path = qenc.toString();
    HttpClientRequest request = http.post(path);
    for (HashMap.Entry e : config.headers.entrySet()) {
      request.putHeader(e.getKey(), e.getValue());
    }
    request.putHeader(HttpHeaders.CONTENT_TYPE, HttpContentTypes.APP_JSON_UTF8);
    request.putHeader(HttpHeaders.USER_AGENT, ExtHttpHeaders.VERTX_AGENT);
    return request;
  }
  
  private HttpClientRequest setSink(HttpClientRequest request, IAsyncPromise promise) {
    return request.handler(httpResponse -> {
      int statusCode = httpResponse.statusCode();
      String statusMessage = httpResponse.statusMessage();
      httpResponse.bodyHandler(buf -> {
        if (statusCode < 200 || statusCode >= 300) {
          String msg = String.format(
            "request (%s) failed  with %d '%s'",
            request.uri(), statusCode, statusMessage
          );
          promise.fail(msg);
          return;
        }
        final DdogApiResult result;
        try {
          result = new DdogApiResult(
            statusCode, statusMessage, buf.toString(StandardCharsets.UTF_8)
          );
        } catch (Throwable cause) {
          promise.fail(cause);
          return;
        }
        promise.succeed(result);
      })
        .exceptionHandler(cause -> promise.fail(cause));
    })
      .exceptionHandler(cause -> promise.fail(cause));
  }
  
  public void postSeries(DdogSeries[] series, IAsyncHandler cont) {
    final HttpClientRequest request;
    final IAsyncPromise promise = AsyncPromise.from(cont);
    try {
      request = createPostRequest("series");
      setSink(request, promise);
      request.end(Buffer.buffer(
        mapper.writeValueAsBytes(new PostSeriesPayload(series))
      ));
    } catch (Throwable cause) {
      promise.fail(cause);
    }
    
  }
  
  public void postEvent(DdogEvent event, IAsyncHandler cont) {
    final HttpClientRequest request;
    final IAsyncPromise promise = AsyncPromise.from(cont);
    try {
      request = createPostRequest("events");
      setSink(request, promise);
      request.end(Buffer.buffer(
        mapper.writeValueAsBytes(event)
      ));
    } catch (Throwable cause) {
      promise.fail(cause);
    }
    
  }
  
  public void close() {
    if (http != null) {
      http.close();
    }
  }
  
  @JsonInclude(JsonInclude.Include.NON_DEFAULT)
  public static class PostSeriesPayload {
    @JsonProperty("series")
    public DdogSeries[] series = null;
    
    public PostSeriesPayload(DdogSeries[] series) {
      this.series = series;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy