Browse Source

Initial Documenter docs (#3)

pull/4/head
Fredrik Ekre 2 years ago committed by GitHub
parent
commit
f8b969fd9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      .github/workflows/CI.yml
  2. 1
      .gitignore
  3. 87
      README.md
  4. 292
      docs/Manifest.toml
  5. 3
      docs/Project.toml
  6. 25
      docs/liveserver.jl
  7. 59
      docs/make.jl
  8. 180
      docs/src/index.md
  9. 82
      src/Prometheus.jl

22
.github/workflows/CI.yml

@ -44,3 +44,25 @@ jobs:
- uses: codecov/codecov-action@v3 - uses: codecov/codecov-action@v3
with: with:
file: lcov.info file: lcov.info
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: julia-actions/setup-julia@v1
with:
version: '1'
- uses: actions/cache@v3
with:
path: |
~/.julia/artifacts
~/.julia/packages
~/.julia/registries
key: .julia-docs-${{ hashFiles('docs/Project.toml', 'docs/Manifest.toml') }}
- name: Install dependencies
run: julia --project=docs -e 'using Pkg; Pkg.instantiate()'
- name: Build and deploy
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }}
run: julia --project=docs --color=yes docs/make.jl

1
.gitignore vendored

@ -1,3 +1,4 @@
/Manifest.toml /Manifest.toml
*.cov *.cov
/lcov.info /lcov.info
/docs/build/

87
README.md

@ -1,7 +1,10 @@
# Prometheus.jl - Prometheus client for Julia # Prometheus.jl - Prometheus client for Julia
[![ci-status](https://github.com/fredrikekre/Prometheus.jl/actions/workflows/CI.yml/badge.svg?event=push)](https://github.com/fredrikekre/Prometheus.jl/actions/workflows/CI.yml) | **Documentation** | **Build Status** |
[![codecov-status](https://codecov.io/github/fredrikekre/Prometheus.jl/graph/badge.svg)](https://codecov.io/github/fredrikekre/Prometheus.jl) |:------------------------- |:------------------------------------------------------- |
| [![][docs-img]][docs-url] | [![][ci-img]][ci-url] [![][coverage-img]][coverage-url] |
Prometheus.jl is a Julia client for [Prometheus](https://prometheus.io/).
## Quickstart ## Quickstart
@ -38,75 +41,17 @@
# TYPE request_count counter # TYPE request_count counter
request_count 1 request_count 1
``` ```
The default output contains some default metrics (see [GCCollector](#gccollector) and The output contains some default metrics related to the running process, as well as the
[ProcessCollector](#processcollector)), as well as the request counter that we added request counter that we added ourselves. Every time you refresh, the counter will
ourselves. Every time you refresh, the counter will increment its value. `close(server)` increment its value. `close(server)` will shutdown the server.
will shutdown the server.
## Collectors
### Counter
See <https://prometheus.io/docs/concepts/metric_types/#counter> for details.
Supported methods:
- `Prometheus.inc(counter)`: increment the counter with 1.
- `Prometheus.inc(counter, v)`: increment the counter with `v`.
### Gauge
See <https://prometheus.io/docs/concepts/metric_types/#gauge> for details.
Supported methods:
- `Prometheus.inc(gauge)`: increment the gauges's value with 1.
- `Prometheus.inc(gauge, v)`: increment the gauge's value with `v`.
- `Prometheus.dec(gauge)`: decrement the gauges's value with 1.
- `Prometheus.dec(gauge, v)`: decrement the gauge's value with `v`.
- `Prometheus.set_to_current_time(gauge)`: set the gauge's value to the current unixtime in
seconds.
### Summary
See <https://prometheus.io/docs/concepts/metric_types/#summary> for details.
Supported methods:
- `Prometheus.observe(summary, v)`: record the observed value `v`.
### GCCollector
A collector that exports metrics about allocations and garbage collection (for example
number of allocations, number of bytes allocated, time spent in garbage collection, etc).
These metrics have the `gc_` prefix in their name.
### ProcessCollector
A collector that exports metrics about a running process, for example CPU seconds and
metrics about I/O operations. Metrics from this collector have the `process_` prefix in
their name. This collector is only available on Linux since it requires the `/proc` file
system.
## Labels
See <https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels> for details.
All metrics can be labeled using the special `Prometheus.Family` collector. For example, a Visit the [documentation](https://fredrikekre.github.io/Prometheus.jl/) for
labeled Counter collector much more details!
```julia
labelnames = ["endpoint", "status_code"]
counter_family = Prometheus.Family{Prometheus.Collector}(
"http_requests",
"Number of processed requests",
labelnames,
)
```
Supported methods:
- `Prometheus.labels(family, ["label 1", "label 2"])`: extract the child collector
corresponding to the labels `["label 1", "label 2"]`.
- `Prometheus.remove(family, ["label 1", "label 2"])`: remove the child collector
corresponding to the labels `["label 1", "label 2"]`.
- `Prometheus.clear(family)`: clear all child collectors.
## Registries [docs-img]: https://img.shields.io/badge/docs-latest%20release-blue.svg
[docs-url]: https://fredrikekre.github.io/Prometheus.jl/
[ci-img]: https://github.com/fredrikekre/Prometheus.jl/actions/workflows/CI.yml/badge.svg?event=push
[ci-url]: https://github.com/fredrikekre/Prometheus.jl/actions/workflows/CI.yml
[coverage-img]: https://codecov.io/github/fredrikekre/Prometheus.jl/graph/badge.svg
[coverage-url]: https://codecov.io/github/fredrikekre/Prometheus.jl

292
docs/Manifest.toml

@ -0,0 +1,292 @@
# This file is machine-generated - editing it directly is not advised
julia_version = "1.9.3"
manifest_format = "2.0"
project_hash = "53cbdb0f6aa70ecb8ff1b1f6baa22bced23c24e5"
[[deps.ANSIColoredPrinters]]
git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c"
uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9"
version = "0.0.1"
[[deps.AbstractTrees]]
git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.4.4"
[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
version = "1.1.1"
[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
[[deps.BitFlags]]
git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d"
uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35"
version = "0.1.7"
[[deps.CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
git-tree-sha1 = "cd67fc487743b2f0fd4380d4cbd3a24660d0eec8"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.3"
[[deps.ConcurrentUtilities]]
deps = ["Serialization", "Sockets"]
git-tree-sha1 = "8cfa272e8bdedfa88b6aefbbca7c19f1befac519"
uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
version = "2.3.0"
[[deps.Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
[[deps.DocStringExtensions]]
deps = ["LibGit2"]
git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
version = "0.9.3"
[[deps.Documenter]]
deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "Dates", "DocStringExtensions", "Downloads", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "Test", "Unicode"]
git-tree-sha1 = "662fb21ae7fad33e044c2b59ece832fdce32c171"
uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
version = "1.1.2"
[[deps.Downloads]]
deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
version = "1.6.0"
[[deps.ExceptionUnwrapping]]
deps = ["Test"]
git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96"
uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
version = "0.1.9"
[[deps.FileWatching]]
uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
[[deps.HTTP]]
deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
git-tree-sha1 = "5eab648309e2e060198b45820af1a37182de3cce"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "1.10.0"
[[deps.IOCapture]]
deps = ["Logging", "Random"]
git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6"
uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89"
version = "0.2.3"
[[deps.InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
[[deps.JLLWrappers]]
deps = ["Artifacts", "Preferences"]
git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
version = "1.5.0"
[[deps.JSON]]
deps = ["Dates", "Mmap", "Parsers", "Unicode"]
git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.4"
[[deps.LazilyInitializedFields]]
git-tree-sha1 = "410fe4739a4b092f2ffe36fcb0dcc3ab12648ce1"
uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf"
version = "1.2.1"
[[deps.LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
version = "0.6.3"
[[deps.LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
version = "7.84.0+0"
[[deps.LibGit2]]
deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
[[deps.LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
version = "1.10.2+0"
[[deps.Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
[[deps.LoggingExtras]]
deps = ["Dates", "Logging"]
git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075"
uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
version = "1.0.3"
[[deps.Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
[[deps.MarkdownAST]]
deps = ["AbstractTrees", "Markdown"]
git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899"
uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391"
version = "0.1.2"
[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"]
git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
version = "1.1.7"
[[deps.MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
version = "2.28.2+0"
[[deps.Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"
[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
version = "2022.10.11"
[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
version = "1.2.0"
[[deps.OpenSSL]]
deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2"
uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
version = "1.4.1"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "cc6e1927ac521b659af340e0ca45828a3ffc748f"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
version = "3.0.12+0"
[[deps.Parsers]]
deps = ["Dates", "PrecompileTools", "UUIDs"]
git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "2.7.2"
[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
version = "1.9.2"
[[deps.PrecompileTools]]
deps = ["Preferences"]
git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f"
uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
version = "1.2.0"
[[deps.Preferences]]
deps = ["TOML"]
git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
version = "1.4.1"
[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
[[deps.Prometheus]]
deps = ["CodecZlib", "HTTP", "SimpleBufferStream", "Sockets"]
path = ".."
uuid = "f25c1797-fe98-4e0c-b252-1b4fe3b6bde6"
version = "1.0.0"
[[deps.REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
[[deps.Random]]
deps = ["SHA", "Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
[[deps.RegistryInstances]]
deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"]
git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51"
uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3"
version = "0.1.0"
[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
version = "0.7.0"
[[deps.Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
[[deps.SimpleBufferStream]]
git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1"
uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
version = "1.1.0"
[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
[[deps.TOML]]
deps = ["Dates"]
uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
version = "1.0.3"
[[deps.Tar]]
deps = ["ArgTools", "SHA"]
uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
version = "1.10.0"
[[deps.Test]]
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[[deps.TranscodingStreams]]
git-tree-sha1 = "49cbf7c74fafaed4c529d47d48c8f7da6a19eb75"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.10.1"
weakdeps = ["Random", "Test"]
[deps.TranscodingStreams.extensions]
TestExt = ["Test", "Random"]
[[deps.URIs]]
git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b"
uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
version = "1.5.1"
[[deps.UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
[[deps.Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
[[deps.Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
version = "1.2.13+0"
[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
version = "1.48.0+0"
[[deps.p7zip_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
version = "17.4.0+0"

3
docs/Project.toml

@ -0,0 +1,3 @@
[deps]
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
Prometheus = "f25c1797-fe98-4e0c-b252-1b4fe3b6bde6"

25
docs/liveserver.jl

@ -0,0 +1,25 @@
#!/usr/bin/env julia
# Root of the repository
const repo_root = dirname(@__DIR__)
# Make sure docs environment is active and instantiated
import Pkg
Pkg.activate(@__DIR__)
Pkg.instantiate()
# Communicate with docs/make.jl that we are running in live mode
push!(ARGS, "liveserver")
# Run LiveServer.servedocs(...)
import LiveServer
LiveServer.servedocs(;
# Documentation root where make.jl and src/ are located
foldername = joinpath(repo_root, "docs"),
# Extra source folder to watch for changes
include_dirs = [
# Watch the src folder so docstrings can be Revise'd
joinpath(repo_root, "src"),
],
)

59
docs/make.jl

@ -0,0 +1,59 @@
const liveserver = "liveserver" in ARGS
if liveserver
using Revise
Revise.revise()
end
using Documenter
using Prometheus
# Build it!
Documenter.makedocs(
sitename = "Prometheus.jl",
format = Documenter.HTML(
canonical = "https://fredrikekre.github.io/Prometheus.jl/v1",
),
modules = [Prometheus],
warnonly = true,
)
# Rewrite to "single page" mode
index = joinpath(@__DIR__, "build/index.html")
str = read(index, String)
# Remove the sidebar
str = replace(str, r"<nav class=\"docs-sidebar\">.*?</nav>" => "")
# Remove the breadcrumb
str = replace(str, r"<nav class=\"breadcrumb\">.*?</nav>" => "")
# Remove the hamburger in narrow mode
str = replace(str, r"<a class=\"docs-sidebar-button.*?</a>" => "")
# Move the buttons to the right
str = replace(str, r"<div class=\"docs-right\">" => "<div class=\"docs-right\" style=\"margin-left: auto;\">")
# Center the content
str = replace(str, r"<div class=\"docs-main\">" => "<div class=\"docs-main\" style=\"margin: auto; padding-right: 0;\">")
# Remove the global docstring folding
str = replace(str, r"<a class=\"docs-article-toggle-button.*?</a>" => "")
# Write it back
write(index, str)
# Nuke a function in documenter.js...
documenterjs = joinpath(@__DIR__, "build/assets/documenter.js")
str = read(documenterjs, String)
str = replace(
str,
"""
document.querySelector(".docs-search-query").addEventListener("click", () => {
openModal();
});
""" => ""
)
write(documenterjs, str)
# Deploy it!
if !liveserver
Documenter.deploydocs(
repo = "github.com/fredrikekre/Prometheus.jl.git",
push_preview = true,
versions = ["v1" => "v^", "v#.#", "dev" => "dev"],
)
end

180
docs/src/index.md

@ -0,0 +1,180 @@
# Prometheus.jl
## Introduction
This package is a Julia client for [Prometheus](https://prometheus.io/). If you are not
familiar with Prometheus it is recommended to browse the [upstream
documentation](https://prometheus.io/docs/introduction/overview/). The documentation here
focuses on the Julia client.
Two of the basic concepts of a Prometheus client are [Registries](@ref) and
[Collectors](@ref). Registries are collections of collectors, and the collectors are the
units responsible to record and capture metrics. Client libraries implement a default
registry which all collectors implicity register with, so for basic usage there is no need
to interact with a registry (see [Default collector registry](@ref)).
The third important concept is [Exposition](@ref) of the collected metrics. Typically
metrics are exposed over a HTTP server, as in the [Quickstart](@ref)-example just below. See
the section about [Exposition](@ref) for more details and examples on how metrics can be
exposed.
## Quickstart
1. Install Prometheus.jl and [HTTP.jl](https://github.com/JuliaWeb/HTTP.jl)
using the package manager:
```
pkg> add Prometheus HTTP
```
2. Paste the following code into a Julia REPL.
```julia
# Load the packages
using Prometheus, HTTP
# Create a Counter metric
const request_counter = Prometheus.Counter("request_count", "Number of handled requests")
# Start a HTTP server on localhost port 8000 to server the metrics
server = HTTP.listen!(8000) do http
Prometheus.inc(request_counter) # Increment the request counter
return Prometheus.expose(http) # Expose the metrics
end
```
3. Visit <http://localhost:8000> in your browser. You will see something like the following
```
# HELP gc_alloc_bytes_total Total number of allocated bytes
# TYPE gc_alloc_bytes_total counter
gc_alloc_bytes_total 365578814
[...]
# HELP request_count Number of handled requests
# TYPE request_count counter
request_count 1
```
The output contains some default metrics related to the running process, as well as the
request counter that we added ourselves. Every time you refresh, the counter will
increment its value. `close(server)` will shutdown the server.
## Collectors
This section documents the collectors that are currently supported. This include the "basic"
collectors ([Counter](@ref), [Gauge](@ref), [Summary](@ref)) as well as some custom
collectors ([GCCollector](@ref), [ProcessCollector](@ref)). There is also a section on how
to implement your own collector, see [Custom collectors](@ref).
Upstream documentation:
- <https://prometheus.io/docs/concepts/metric_types/>
- <https://prometheus.io/docs/instrumenting/writing_clientlibs/#metrics>
### Counter
Quoting the [upstream
documentation](https://prometheus.io/docs/concepts/metric_types/#counter):
> A counter is a cumulative metric that represents a single monotonically increasing counter
> whose value can only increase or be reset to zero on restart. For example, you can use a
> counter to represent the number of requests served, tasks completed, or errors.
>
> Do not use a counter to expose a value that can decrease. For example, do not use a
> counter for the number of currently running processes; instead use a gauge.
#### Counter API reference
```@docs
Prometheus.Counter
Prometheus.inc(::Prometheus.Counter, ::Any)
```
### Gauge
Quoting the [upstream
documentation](https://prometheus.io/docs/concepts/metric_types/#gauge):
> A gauge is a metric that represents a single numerical value that can arbitrarily go up
> and down.
>
> Gauges are typically used for measured values like temperatures or current memory usage,
> but also "counts" that can go up and down, like the number of concurrent requests.
#### Gauge API reference
```@docs
Prometheus.Gauge
Prometheus.inc(::Prometheus.Gauge, ::Any)
Prometheus.dec(::Prometheus.Gauge, ::Any)
Prometheus.set(::Prometheus.Gauge, ::Any)
Prometheus.set_to_current_time(::Prometheus.Gauge)
```
### Summary
Quoting the [upstream
documentation](https://prometheus.io/docs/concepts/metric_types/#summary):
> Similar to a histogram, a summary samples observations (usually things like request
> durations and response sizes). While it also provides a total count of observations and a
> sum of all observed values, it calculates configurable quantiles over a sliding time
> window.
#### Summary API reference
```@docs
Prometheus.Summary
Prometheus.observe(::Prometheus.Summary, ::Any)
```
### GCCollector
A collector that exports metrics about allocations and garbage collection (for example
number of allocations, number of bytes allocated, time spent in garbage collection, etc).
These metrics have the `gc_` prefix in their name.
### ProcessCollector
A collector that exports metrics about a running process, for example CPU seconds and
metrics about I/O operations. Metrics from this collector have the `process_` prefix in
their name. This collector is only available on Linux since it requires the `/proc` file
system.
### Custom collectors
RandomCollector
## Labels
See <https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels> for details.
All metrics can be labeled using the special `Prometheus.Family` collector. For example, a
labeled Counter collector
```julia
labelnames = ["endpoint", "status_code"]
counter_family = Prometheus.Family{Prometheus.Collector}(
"http_requests",
"Number of processed requests",
labelnames,
)
```
Supported methods:
- `Prometheus.labels(family, ["label 1", "label 2"])`: extract the child collector
corresponding to the labels `["label 1", "label 2"]`.
- `Prometheus.remove(family, ["label 1", "label 2"])`: remove the child collector
corresponding to the labels `["label 1", "label 2"]`.
- `Prometheus.clear(family)`: clear all child collectors.
## Registries
### Default collector registry
## Exposition
Prometheus support
```@docs
Prometheus.expose
```

82
src/Prometheus.jl

@ -129,10 +129,32 @@ function Counter(metric_name::String, help::String)
return Counter(DEFAULT_REGISTRY, metric_name, help) return Counter(DEFAULT_REGISTRY, metric_name, help)
end end
"""
Prometheus.Counter(; name, help, registry=DEFAULT_REGISTRY)
Construct a Counter collector.
**Required keyword arguments**
- `name :: String`: the name of the counter metric.
- `help :: String`: the documentation for the counter metric.
**Optional keyword arguments**
- `registry :: Prometheus.CollectorRegistry`: the registry in which to register the
collector. If not specified the default registry is used. Pass `registry = nothing` to
skip registration.
"""
Counter
function metric_names(counter::Counter) function metric_names(counter::Counter)
return (counter.metric_name, ) return (counter.metric_name, )
end end
"""
Prometheus.inc(c::Counter, v = 1)
Increment the value of the counter `c` with `v`.
`v` must be non-negative, and defaults to `v = 1`.
"""
function inc(m::Counter, v = 1.0) function inc(m::Counter, v = 1.0)
if v < 0 if v < 0
error("counting backwards") error("counting backwards")
@ -187,10 +209,32 @@ function Gauge(metric_name::String, help::String)
return Gauge(DEFAULT_REGISTRY, metric_name, help) return Gauge(DEFAULT_REGISTRY, metric_name, help)
end end
"""
Prometheus.Gauge(; name, help, registry=DEFAULT_REGISTRY)
Construct a Gauge collector.
**Required keyword arguments**
- `name :: String`: the name of the gauge metric.
- `help :: String`: the documentation for the gauge metric.
**Optional keyword arguments**
- `registry :: Prometheus.CollectorRegistry`: the registry in which to register the
collector. If not specified the default registry is used. Pass `registry = nothing` to
skip registration.
"""
Gauge
function metric_names(gauge::Gauge) function metric_names(gauge::Gauge)
return (gauge.metric_name, ) return (gauge.metric_name, )
end end
"""
Prometheus.inc(g::Gauge, v = 1)
Increment the value of the gauge `g` with `v`.
`v` defaults to `v = 1`.
"""
function inc(m::Gauge, v = 1.0) function inc(m::Gauge, v = 1.0)
if v < 0 if v < 0
error("incrementing with negative value, use dec(...)?") error("incrementing with negative value, use dec(...)?")
@ -199,6 +243,12 @@ function inc(m::Gauge, v = 1.0)
return nothing return nothing
end end
"""
Prometheus.dec(g::Gauge, v = 1)
Decrement the value of the gauge `g` with `v`.
`v` defaults to `v = 1`.
"""
function dec(m::Gauge, v = 1.0) function dec(m::Gauge, v = 1.0)
if v < 0 if v < 0
error("decrementing with negative value, use inc(...)?") error("decrementing with negative value, use inc(...)?")
@ -207,11 +257,21 @@ function dec(m::Gauge, v = 1.0)
return nothing return nothing
end end
"""
Prometheus.set(g::Gauge, v)
Set the value of the gauge to `v`.
"""
function set(m::Gauge, v) function set(m::Gauge, v)
@atomic m.value = v @atomic m.value = v
return nothing return nothing
end end
"""
Prometheus.set_to_current_time(g::Gauge)
Set the value of the gauge to the current unixtime in seconds.
"""
function set_to_current_time(m::Gauge) function set_to_current_time(m::Gauge)
@atomic m.value = time() @atomic m.value = time()
return nothing return nothing
@ -263,10 +323,32 @@ function Summary(metric_name::String, help::String)
return Summary(DEFAULT_REGISTRY, metric_name, help) return Summary(DEFAULT_REGISTRY, metric_name, help)
end end
"""
Prometheus.Summary(; name, help, registry=DEFAULT_REGISTRY)
Construct a Summary collector.
**Required keyword arguments**
- `name :: String`: the name of the summary metric.
- `help :: String`: the documentation for the summary metric.
**Optional keyword arguments**
- `registry :: Prometheus.CollectorRegistry`: the registry in which to register the
collector. If not specified the default registry is used. Pass `registry = nothing` to
skip registration.
"""
Summary
function metric_names(summary::Summary) function metric_names(summary::Summary)
return (summary.metric_name * "_count", summary.metric_name * "_sum") return (summary.metric_name * "_count", summary.metric_name * "_sum")
end end
"""
Prometheus.observe(summary::Summary, v)
Add the observed value `v` to the summary.
This increases the sum and count of the summary with `v` and `1`, respectively.
"""
function observe(summary::Summary, v) function observe(summary::Summary, v)
@atomic summary._count += 1 @atomic summary._count += 1
@atomic summary._sum += v @atomic summary._sum += v

Loading…
Cancel
Save