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

it.agilelab.bigdata.wasp.master.web.openapi.TelemetryRoutesOpenApiDefinition.scala Maven / Gradle / Ivy

package it.agilelab.bigdata.wasp.master.web.openapi

import java.time.Instant

import io.swagger.v3.oas.models.media.{Content, MediaType}
import io.swagger.v3.oas.models.parameters.Parameter
import io.swagger.v3.oas.models.responses.{ApiResponse, ApiResponses}
import io.swagger.v3.oas.models.{Operation, PathItem}
import it.agilelab.bigdata.wasp.models.{Aggregate, MetricEntry, Metrics, SourceEntry, Sources, TelemetryPoint, TelemetrySeries}

trait TelemetryOpenApiComponentSupport
    extends ProductOpenApi
    with LangOpenApi
    with CollectionsOpenApi
    with EnumOpenApi {
  implicit lazy val sourcesOpenApi: ToOpenApiSchema[Sources]         = product2(Sources.apply)
  implicit lazy val metricsOpenApi: ToOpenApiSchema[Metrics]         = product2(Metrics.apply)
  implicit lazy val sourceEntryOpenApi: ToOpenApiSchema[SourceEntry] = product1(SourceEntry.apply)
  implicit lazy val metricEntryOpenApi: ToOpenApiSchema[MetricEntry] = product2(MetricEntry.apply)
  implicit lazy val seriesOpenApi: ToOpenApiSchema[TelemetrySeries]  = product3(TelemetrySeries.apply)
  implicit lazy val telemetryPointOpenApi: ToOpenApiSchema[TelemetryPoint] =
    product2(TelemetryPoint.apply)

  implicit lazy val aggregateOpenApi: ToOpenApiSchema[Aggregate.Value] = enumOpenApi(Aggregate)
}

trait TelemetrRoutesOpenApiDefinition
    extends TelemetryOpenApiComponentSupport
    with AngularResponseOpenApiComponentSupport {

  def telemetryRoutes(ctx: Context): Map[String, PathItem] = {
    Map("/telemetry/sources" -> sources(ctx), "/telemetry/metrics" -> metrics(ctx), "/telemetry/series" -> series(ctx))
  }

  private def sources(ctx: Context) = {
    new PathItem()
      .get(
        new Operation()
          .operationId("list-telemetry-source")
          .description("List top telemetry sources matching search")
          .addTagsItem("telemetry")
          .addParametersItem(
            new Parameter()
              .name("search")
              .in("query")
              .required(true)
              .schema(stringOpenApi.schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("size")
              .in("query")
              .required(true)
              .schema(integerOpenApi.schema(ctx))
          )
          .responses(
            new ApiResponses()
              .addApiResponse(
                "200",
                new ApiResponse()
                  .description("Top sources matching query")
                  .content(
                    new Content()
                      .addMediaType(
                        "text/json",
                        new MediaType()
                          .schema(
                            ToOpenApiSchema[AngularResponse[Sources]]
                              .schema(ctx)
                          )
                      )
                  )
              )
          )
      )
  }

  private def metrics(ctx: Context) = {
    new PathItem()
      .get(
        new Operation()
          .operationId("list-telemetry-metric")
          .description("List top telemetry metrics for source matching search")
          .addTagsItem("telemetry")
          .addParametersItem(
            new Parameter()
              .name("search")
              .in("query")
              .required(true)
              .schema(stringOpenApi.schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("source")
              .in("query")
              .required(true)
              .schema(stringOpenApi.schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("size")
              .in("query")
              .required(true)
              .schema(integerOpenApi.schema(ctx))
          )
          .responses(
            new ApiResponses()
              .addApiResponse(
                "200",
                new ApiResponse()
                  .description("Top sources matching query")
                  .content(
                    new Content()
                      .addMediaType(
                        "text/json",
                        new MediaType()
                          .schema(
                            ToOpenApiSchema[AngularResponse[Metrics]]
                              .schema(ctx)
                          )
                      )
                  )
              )
          )
      )
  }

  private def series(ctx: Context) = {
    new PathItem()
      .get(
        new Operation()
          .operationId("get-telemetry-series")
          .description("Retrieves series data pre aggregated by the server for display")
          .addTagsItem("telemetry")
          .addParametersItem(
            new Parameter()
              .name("metric")
              .in("query")
              .required(true)
              .schema(stringOpenApi.schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("source")
              .in("query")
              .required(true)
              .schema(stringOpenApi.schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("size")
              .in("query")
              .description(
                "The number of buckets to aggregate data in, the start and end timestamp" +
                  " will be divided in [size] number buckets "
              )
              .required(true)
              .schema(integerOpenApi.schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("startTimestamp")
              .in("query")
              .required(true)
              .schema(ToOpenApiSchema[Instant].schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("endTimestamp")
              .in("query")
              .required(true)
              .schema(ToOpenApiSchema[Instant].schema(ctx))
          )
          .addParametersItem(
            new Parameter()
              .name("aggregate")
              .in("query")
              .required(true)
              .schema(aggregateOpenApi.schema(ctx))
          )
          .responses(
            new ApiResponses()
              .addApiResponse(
                "200",
                new ApiResponse()
                  .description("Series data matching query")
                  .content(
                    new Content()
                      .addMediaType(
                        "text/json",
                        new MediaType()
                          .schema(
                            ToOpenApiSchema[AngularResponse[TelemetrySeries]]
                              .schema(ctx)
                          )
                      )
                  )
              )
          )
      )
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy