Network health-check primitives for Go — TCP, TLS, HTTP, HTTPS, DNS, ICMP ping, WebSocket, and certificate expiry. Flat package, no sub-packages.
go get github.com/mismatched/libtowerpackage main
import (
"context"
"net/url"
"time"
"github.com/mismatched/libtower"
)
func main() {
ctx := context.Background()
// TCP port check
u, _ := url.Parse("tcp://example.com:443")
tcp := &libtower.TCP{URL: u, Timeout: 5 * time.Second}
ok, _ := tcp.TCPPortCheck(ctx)
// DNS lookup
ip, dur, _ := libtower.DNSLookup("example.com")
// TLS cert check with expiry warning
hs := &libtower.HTTPS{
Host: "example.com",
Timeout: 5 * time.Second,
WarnIfExpiringWithin: 30 * 24 * time.Hour,
}
r := hs.Check(ctx)
if r.Warning != nil {
println("cert expiring soon:", r.Warning.Error())
}
_ = ok
_ = ip
_ = dur
}| Check | Type/Function | Returns |
|---|---|---|
| TCP port | TCP.TCPPortCheck(ctx) |
(bool, error) |
| TLS port (client cert) | TCP.TLSPortCheck(ctx) |
(bool, error) |
| HTTP status | HTTP.HTTPStatus() |
error (receiver populated) |
| HTTP trace (per-phase timing) | HTTPTrace.Trace() |
error (receiver populated) |
| TLS cert validity | HTTPS.HTTPSCheck(ctx) |
(bool, time.Time, error) |
| DNS lookup | DNSLookup(addr) |
(*net.IPAddr, time.Duration, error) |
| Direct DNS query | DNSLookupFrom(addr, server) |
(*net.IPAddr, time.Duration, error) |
| ICMP ping |
Ping(addr, seq) |
(*net.IPAddr, time.Duration, error) |
| WebSocket | WebSocket.WSCheck(ctx) |
error |
CAP_NET_RAW on Linux).
All types implement Checker, so you can run them uniformly:
checks := []libtower.Checker{
&libtower.TCP{URL: u, Timeout: time.Second},
&libtower.HTTPS{Host: "example.com", WarnIfExpiringWithin: 30 * 24 * time.Hour},
&libtower.DNS{ADDR: "example.com"},
}
for _, c := range checks {
r := c.Check(ctx)
if !r.OK { panic(r.Error) }
}Short names (Ping, DNSLookup) use context.Background(). Use the ...Context variants for cancellation:
PingContext(ctx, addr, seq)
DNSLookupContext(ctx, addr)
DNSLookupFromContext(ctx, addr, server)
HTTPStatusContext(ctx)
TraceContext(ctx)MIT