Skip to content

Instantly share code, notes, and snippets.

@phdoerfler
Last active April 3, 2021 18:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phdoerfler/6d44a639aabb4846017ea73ff8a26159 to your computer and use it in GitHub Desktop.
Save phdoerfler/6d44a639aabb4846017ea73ff8a26159 to your computer and use it in GitHub Desktop.
Scala HTTP & JSON
import io.circe.generic.extras.JsonKey
import sttp.client3._

import sttp.client3.circe._
import shapeless._
import io.circe._
import io.circe.generic.semiauto._
import io.circe.generic.auto._
import io.circe.generic.extras._, io.circe.syntax._

val backend = HttpURLConnectionBackend()

def fetch(queryType: String, params: Map[String, String]) = {
  basicRequest
  .post(uri"https://monitoring.nixos.org/prometheus/api/v1/${queryType}?${params}")
  .response(asJson[Reply])
  .send(backend)
}

implicit val config: Configuration = Configuration.default.withSnakeCaseMemberNames

fetch("query", Map("query" -> "hydra_job_failed"))


case class Data (
  resultType: String,
  result: Seq[Result]
)

@ConfiguredJsonCodec
case class Metric (
  @JsonKey("__name__")
  name: String,
  channel: String,
  current: String,
  exportedJob: String,
  instance: String,
  job: String,
  jobset: String,
  project: String
)

case class Result (
  metric: Metric,
  value: Seq[Double]
)

case class Reply (
  status: String,
  data: Data
)
// http
lazy val sttpVersion = "3.2.3"
val circeVersion = "0.13.0"
libraryDependencies ++= Seq(
  "com.softwaremill.sttp.client3" %% "core"                 % sttpVersion,
  "com.softwaremill.sttp.client3" %% "circe"                % sttpVersion,
  "io.circe"                      %% "circe-generic"        % circeVersion,
  "io.circe"                      %% "circe-generic-extras" % circeVersion,
)
scalacOptions ++= Seq("-Ymacro-annotations") // For circe-generic-extra’s @JsonCodec macro annotations
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment