Integrações (OAuth2, Mail, Métricas)
🧪 Experimental — parte da camada
core(kyrux/core), a mesma usada pelas APIs e o NoSQL. Rotulada "experimental" pelo próprioUSE.mddo framework.
OAuth2 — core.Auth.OAuth2
Fluxo Authorization Code, genérico pra qualquer provedor (Google, GitHub,
IdP interno) — você informa authURL/tokenURL (o pacote
golang.org/x/oauth2/endpoints já traz os dos provedores mais comuns).
import "kyrux/core"
c := core.New()
cfg, err := c.Auth.OAuth2("google",
clientID, clientSecret,
"https://accounts.google.com/o/oauth2/auth",
"https://oauth2.googleapis.com/token",
"https://meuapp.com/callback",
"email", "profile", // scopes
)
// devolve *oauth2.Config padrão do golang.org/x/oauth2:
url := cfg.AuthCodeURL(state)
token, err := cfg.Exchange(ctx, code)
httpClient := cfg.Client(ctx, token)
Init falha rápido se clientID/clientSecret ou authURL/tokenURL
estiverem vazios — erro na hora de montar, não no primeiro request.
Mail/SMTP — core.Mail.SMTP
Envio via net/smtp puro (sem lib de terceiros) — monta MIME multipart
(alternative/mixed) sozinho, texto + HTML + anexos.
import (
"kyrux/core"
kymail "kyrux/core/mail"
)
c := core.New()
client, err := c.Mail.SMTP("principal", host, port, username, password, true) // true = STARTTLS
err = client.Send(ctx, kymail.Message{
From: "[email protected]",
To: []string{"[email protected]"},
Subject: "Bem-vindo",
Text: "Obrigado por se cadastrar.",
HTML: "<p>Obrigado por se cadastrar.</p>",
Attachments: []kymail.Attachment{
{Filename: "nota.pdf", Content: pdfBytes, ContentType: "application/pdf"},
},
})
Porta 465 usa TLS implícito (SMTPS) automaticamente — detectado pela
porta, sem parâmetro extra: o handshake TLS começa antes de qualquer byte
do protocolo SMTP, então StartTLS não entra em jogo e o useTLS do
exemplo acima é ignorado nesse caso. Qualquer outra porta (ex: 587) segue
o comportamento de sempre — texto plano com STARTTLS opcional via useTLS.
Configure faz apenas um dial TCP em texto plano como checagem de
conectividade (sem TLS, mesmo na porta 465) antes de devolver um client
utilizável — falha cedo se o servidor estiver inacessível, mas o handshake
TLS em si (implícito ou STARTTLS) só acontece no primeiro Send.
kymail.Sender é a interface (Send(ctx, Message) error) — além do SMTP,
existem adapters pra SendGrid (core/adapters/sendgrid) e AWS SES
(core/adapters/ses) implementando a mesma interface. Esses dois não têm
sugar no core.Mail (peso do SDK de terceiros) — ative via
core.UseModule[kymail.Sender].
Métricas — Prometheus e OpenTelemetry
Sem sugar em nenhum dos dois (dependência de terceiros) — ative via
core.UseModule.
Prometheus — core/adapters/prometheus
import (
"kyrux/core"
prometheusadapter "kyrux/core/adapters/prometheus"
prom "github.com/prometheus/client_golang/prometheus"
)
c := core.New()
metrics, err := core.UseModule[*prometheusadapter.Client](
c, prometheusadapter.New("principal"), "observability.prometheus.principal",
)
requestsTotal := prom.NewCounter(prom.CounterOpts{
Name: "kyrux_requests_total",
Help: "Total de requisições",
})
metrics.MustRegister(requestsTotal)
r, _ := c.API.REST(":8080")
r.HandlePrefix("/metrics", metrics.Handler()) // mesmo padrão usado pra montar SOAP
c.Run()
Configure já pré-registra os coletores padrão do runtime Go
(goroutines, GC, etc.). O registry é isolado (*prometheus.Registry
próprio) — não usa o DefaultRegisterer global, então múltiplas instâncias
não colidem.
OpenTelemetry — core/adapters/opentelemetry
Segue o mesmo padrão (New + core.UseModule), exportação OTLP/HTTP
apenas (sem gRPC, sem outros exporters). Consulte o pacote diretamente —
ainda sem página própria na doc.