Skip to content

Commit d754491

Browse files
committed
feat(exp/metricsserver): Expose metrics over libp2p streams
Allows users to run a Prometheus+Grafana setup remotely and gather metrics securely over libp2p.
1 parent 4137ae7 commit d754491

File tree

5 files changed

+934
-0
lines changed

5 files changed

+934
-0
lines changed

exp/cmd/libp2phttpproxy/main.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/http/httputil"
6+
"net/url"
7+
"os"
8+
"os/signal"
9+
"strings"
10+
11+
"github.com/libp2p/go-libp2p"
12+
libp2phttp "github.com/libp2p/go-libp2p/p2p/http"
13+
"github.com/multiformats/go-multiaddr"
14+
)
15+
16+
func main() {
17+
proxyTarget := os.Getenv("PROXY_TARGET")
18+
if proxyTarget == "" {
19+
log.Fatal("PROXY_TARGET must be set")
20+
}
21+
22+
h, err := libp2p.New(libp2p.ListenAddrStrings(
23+
"/ip4/0.0.0.0/tcp/0",
24+
"/ip4/0.0.0.0/tcp/0",
25+
))
26+
if err != nil {
27+
log.Fatal(err)
28+
}
29+
defer h.Close()
30+
31+
const multiaddrPrefix = "multiaddr:"
32+
if !strings.HasPrefix(proxyTarget, multiaddrPrefix) {
33+
log.Fatalf("PROXY_TARGET must start with %q", multiaddrPrefix)
34+
}
35+
36+
targetUrl, _ := url.Parse(proxyTarget)
37+
38+
httpHost := libp2phttp.Host{
39+
StreamHost: h,
40+
InsecureAllowHTTP: true,
41+
ListenAddrs: []multiaddr.Multiaddr{multiaddr.StringCast("/ip4/0.0.0.0/tcp/5005/http")},
42+
}
43+
44+
// reverse proxy
45+
proxy := &httputil.ReverseProxy{
46+
Rewrite: func(r *httputil.ProxyRequest) {
47+
copiedURL := *targetUrl
48+
r.Out.URL = &copiedURL
49+
},
50+
Transport: &httpHost,
51+
}
52+
53+
httpHost.SetHTTPHandlerAtPath("/http-reverse-proxy/0.0.1", "/", proxy)
54+
go httpHost.Serve()
55+
56+
log.Println("Listening on:")
57+
for _, a := range httpHost.Addrs() {
58+
log.Println(a.Encapsulate(multiaddr.StringCast("/p2p/" + h.ID().String())))
59+
}
60+
61+
// Wait for interrupt signal to stop
62+
intSig := make(chan os.Signal, 1)
63+
signal.Notify(intSig, os.Interrupt)
64+
<-intSig
65+
log.Println("Interrupt signal received, closing host")
66+
}

exp/go.mod

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
module github.com/libp2p/go-libp2p/exp
2+
3+
go 1.22.1
4+
5+
require (
6+
github.com/ipfs/go-log/v2 v2.5.1
7+
github.com/libp2p/go-libp2p v0.37.0
8+
github.com/prometheus/client_golang v1.20.5
9+
go.uber.org/fx v1.23.0
10+
)
11+
12+
require (
13+
github.com/benbjohnson/clock v1.3.5 // indirect
14+
github.com/beorn7/perks v1.0.1 // indirect
15+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
16+
github.com/containerd/cgroups v1.1.0 // indirect
17+
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
18+
github.com/davecgh/go-spew v1.1.1 // indirect
19+
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
20+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
21+
github.com/docker/go-units v0.5.0 // indirect
22+
github.com/elastic/gosigar v0.14.3 // indirect
23+
github.com/flynn/noise v1.1.0 // indirect
24+
github.com/francoispqt/gojay v1.2.13 // indirect
25+
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
26+
github.com/godbus/dbus/v5 v5.1.0 // indirect
27+
github.com/gogo/protobuf v1.3.2 // indirect
28+
github.com/google/gopacket v1.1.19 // indirect
29+
github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect
30+
github.com/google/uuid v1.6.0 // indirect
31+
github.com/gorilla/websocket v1.5.3 // indirect
32+
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
33+
github.com/huin/goupnp v1.3.0 // indirect
34+
github.com/ipfs/go-cid v0.4.1 // indirect
35+
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
36+
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
37+
github.com/klauspost/compress v1.17.11 // indirect
38+
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
39+
github.com/koron/go-ssdp v0.0.4 // indirect
40+
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
41+
github.com/libp2p/go-flow-metrics v0.2.0 // indirect
42+
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
43+
github.com/libp2p/go-msgio v0.3.0 // indirect
44+
github.com/libp2p/go-nat v0.2.0 // indirect
45+
github.com/libp2p/go-netroute v0.2.1 // indirect
46+
github.com/libp2p/go-reuseport v0.4.0 // indirect
47+
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
48+
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
49+
github.com/mattn/go-isatty v0.0.20 // indirect
50+
github.com/miekg/dns v1.1.62 // indirect
51+
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
52+
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
53+
github.com/minio/sha256-simd v1.0.1 // indirect
54+
github.com/mr-tron/base58 v1.2.0 // indirect
55+
github.com/multiformats/go-base32 v0.1.0 // indirect
56+
github.com/multiformats/go-base36 v0.2.0 // indirect
57+
github.com/multiformats/go-multiaddr v0.13.0 // indirect
58+
github.com/multiformats/go-multiaddr-dns v0.4.0 // indirect
59+
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
60+
github.com/multiformats/go-multibase v0.2.0 // indirect
61+
github.com/multiformats/go-multicodec v0.9.0 // indirect
62+
github.com/multiformats/go-multihash v0.2.3 // indirect
63+
github.com/multiformats/go-multistream v0.6.0 // indirect
64+
github.com/multiformats/go-varint v0.0.7 // indirect
65+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
66+
github.com/onsi/ginkgo/v2 v2.20.2 // indirect
67+
github.com/opencontainers/runtime-spec v1.2.0 // indirect
68+
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
69+
github.com/pion/datachannel v1.5.9 // indirect
70+
github.com/pion/dtls/v2 v2.2.12 // indirect
71+
github.com/pion/ice/v2 v2.3.36 // indirect
72+
github.com/pion/interceptor v0.1.37 // indirect
73+
github.com/pion/logging v0.2.2 // indirect
74+
github.com/pion/mdns v0.0.12 // indirect
75+
github.com/pion/randutil v0.1.0 // indirect
76+
github.com/pion/rtcp v1.2.14 // indirect
77+
github.com/pion/rtp v1.8.9 // indirect
78+
github.com/pion/sctp v1.8.33 // indirect
79+
github.com/pion/sdp/v3 v3.0.9 // indirect
80+
github.com/pion/srtp/v2 v2.0.20 // indirect
81+
github.com/pion/stun v0.6.1 // indirect
82+
github.com/pion/transport/v2 v2.2.10 // indirect
83+
github.com/pion/turn/v2 v2.1.6 // indirect
84+
github.com/pion/webrtc/v3 v3.3.4 // indirect
85+
github.com/pkg/errors v0.9.1 // indirect
86+
github.com/pmezard/go-difflib v1.0.0 // indirect
87+
github.com/prometheus/client_model v0.6.1 // indirect
88+
github.com/prometheus/common v0.60.0 // indirect
89+
github.com/prometheus/procfs v0.15.1 // indirect
90+
github.com/quic-go/qpack v0.5.1 // indirect
91+
github.com/quic-go/quic-go v0.48.1 // indirect
92+
github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect
93+
github.com/raulk/go-watchdog v1.3.0 // indirect
94+
github.com/spaolacci/murmur3 v1.1.0 // indirect
95+
github.com/stretchr/testify v1.9.0 // indirect
96+
github.com/wlynxg/anet v0.0.5 // indirect
97+
go.uber.org/dig v1.18.0 // indirect
98+
go.uber.org/mock v0.5.0 // indirect
99+
go.uber.org/multierr v1.11.0 // indirect
100+
go.uber.org/zap v1.27.0 // indirect
101+
golang.org/x/crypto v0.28.0 // indirect
102+
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
103+
golang.org/x/mod v0.21.0 // indirect
104+
golang.org/x/net v0.30.0 // indirect
105+
golang.org/x/sync v0.8.0 // indirect
106+
golang.org/x/sys v0.26.0 // indirect
107+
golang.org/x/text v0.19.0 // indirect
108+
golang.org/x/tools v0.26.0 // indirect
109+
google.golang.org/protobuf v1.35.1 // indirect
110+
gopkg.in/yaml.v3 v3.0.1 // indirect
111+
lukechampine.com/blake3 v1.3.0 // indirect
112+
)
113+
114+
replace github.com/libp2p/go-libp2p => ../

0 commit comments

Comments
 (0)