internal/cloudapi: additional prometheus listener
Listening on another port, while keeping the existing endpoint until transition is complete
This commit is contained in:
parent
a8f7ff487d
commit
8398f27742
7 changed files with 80 additions and 5 deletions
|
|
@ -44,7 +44,7 @@ type Composer struct {
|
||||||
weldr *weldr.API
|
weldr *weldr.API
|
||||||
api *cloudapi.Server
|
api *cloudapi.Server
|
||||||
|
|
||||||
weldrListener, localWorkerListener, workerListener, apiListener net.Listener
|
weldrListener, localWorkerListener, workerListener, apiListener, promListener net.Listener
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewComposer(config *ComposerConfigFile, stateDir, cacheDir string) (*Composer, error) {
|
func NewComposer(config *ComposerConfigFile, stateDir, cacheDir string) (*Composer, error) {
|
||||||
|
|
@ -130,6 +130,10 @@ func (c *Composer) InitWeldr(repoPaths []string, weldrListener net.Listener,
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Composer) InitMetricsAPI(prometheus net.Listener) {
|
||||||
|
c.promListener = prometheus
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Composer) InitAPI(cert, key string, enableTLS bool, enableMTLS bool, enableJWT bool, l net.Listener) error {
|
func (c *Composer) InitAPI(cert, key string, enableTLS bool, enableMTLS bool, enableJWT bool, l net.Listener) error {
|
||||||
config := v2.ServerConfig{
|
config := v2.ServerConfig{
|
||||||
JWTEnabled: c.config.Koji.EnableJWT,
|
JWTEnabled: c.config.Koji.EnableJWT,
|
||||||
|
|
@ -218,7 +222,7 @@ func (c *Composer) Start() error {
|
||||||
logrus.Fatal("neither the weldr API socket nor the composer API socket is enabled, osbuild-composer is useless without one of these APIs enabled")
|
logrus.Fatal("neither the weldr API socket nor the composer API socket is enabled, osbuild-composer is useless without one of these APIs enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
var localWorkerAPI, remoteWorkerAPI, composerAPI *http.Server
|
var localWorkerAPI, remoteWorkerAPI, composerAPI, prometheusAPI *http.Server
|
||||||
|
|
||||||
if c.localWorkerListener != nil {
|
if c.localWorkerListener != nil {
|
||||||
localWorkerAPI = &http.Server{
|
localWorkerAPI = &http.Server{
|
||||||
|
|
@ -313,6 +317,25 @@ func (c *Composer) Start() error {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.promListener != nil {
|
||||||
|
// metrics listener on another port
|
||||||
|
metricsMux := http.NewServeMux()
|
||||||
|
metricsMux.Handle("/metrics", promhttp.Handler().(http.HandlerFunc))
|
||||||
|
|
||||||
|
prometheusAPI = &http.Server{
|
||||||
|
ErrorLog: c.logger,
|
||||||
|
Handler: metricsMux,
|
||||||
|
ReadHeaderTimeout: 5 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
err := prometheusAPI.Serve(c.promListener)
|
||||||
|
if err != nil && err != http.ErrServerClosed {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
if c.weldrListener != nil {
|
if c.weldrListener != nil {
|
||||||
go func() {
|
go func() {
|
||||||
err := c.weldr.Serve(c.weldrListener)
|
err := c.weldr.Serve(c.weldrListener)
|
||||||
|
|
@ -341,6 +364,13 @@ func (c *Composer) Start() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.promListener != nil {
|
||||||
|
err := prometheusAPI.Shutdown(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if c.localWorkerListener != nil {
|
if c.localWorkerListener != nil {
|
||||||
err := localWorkerAPI.Shutdown(context.Background())
|
err := localWorkerAPI.Shutdown(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,14 @@ func main() {
|
||||||
composer.InitLocalWorker(l[0])
|
composer.InitLocalWorker(l[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if l, exists := listeners["osbuild-composer-prometheus.socket"]; exists {
|
||||||
|
if len(l) != 1 {
|
||||||
|
logrus.Warn("The osbuild-composer-prometheus.socket unit is misconfigured. It should contain only one socket.")
|
||||||
|
}
|
||||||
|
|
||||||
|
composer.InitMetricsAPI(l[0])
|
||||||
|
}
|
||||||
|
|
||||||
if l, exists := listeners["osbuild-composer-api.socket"]; exists {
|
if l, exists := listeners["osbuild-composer-api.socket"]; exists {
|
||||||
if len(l) != 1 {
|
if len(l) != 1 {
|
||||||
logrus.Fatal("The osbuild-composer-api.socket unit is misconfigured. It should contain only one socket.")
|
logrus.Fatal("The osbuild-composer-api.socket unit is misconfigured. It should contain only one socket.")
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=OSBuild Composer API socket
|
Description=OSBuild Composer API socket
|
||||||
|
Requires=osbuild-composer-prometheus.socket
|
||||||
|
|
||||||
[Socket]
|
[Socket]
|
||||||
Service=osbuild-composer.service
|
Service=osbuild-composer.service
|
||||||
|
|
|
||||||
9
distribution/osbuild-composer-prometheus.socket
Normal file
9
distribution/osbuild-composer-prometheus.socket
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=OSBuild Composer prometheus socket
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
Service=osbuild-composer.service
|
||||||
|
ListenStream=8008
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sockets.target
|
||||||
|
|
@ -262,13 +262,13 @@ cd $PWD/_build/src/%{goipath}
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%post
|
%post
|
||||||
%systemd_post osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-remote-worker.socket
|
%systemd_post osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-composer-prometheus.socket osbuild-remote-worker.socket
|
||||||
|
|
||||||
%preun
|
%preun
|
||||||
%systemd_preun osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-remote-worker.socket
|
%systemd_preun osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-composer-prometheus.socket osbuild-remote-worker.socket
|
||||||
|
|
||||||
%postun
|
%postun
|
||||||
%systemd_postun_with_restart osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-remote-worker.socket
|
%systemd_postun_with_restart osbuild-composer.service osbuild-composer.socket osbuild-composer-api.socket osbuild-composer-prometheus.socket osbuild-remote-worker.socket
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%license LICENSE
|
%license LICENSE
|
||||||
|
|
@ -277,6 +277,7 @@ cd $PWD/_build/src/%{goipath}
|
||||||
%{_unitdir}/osbuild-composer.service
|
%{_unitdir}/osbuild-composer.service
|
||||||
%{_unitdir}/osbuild-composer.socket
|
%{_unitdir}/osbuild-composer.socket
|
||||||
%{_unitdir}/osbuild-composer-api.socket
|
%{_unitdir}/osbuild-composer-api.socket
|
||||||
|
%{_unitdir}/osbuild-composer-prometheus.socket
|
||||||
%{_unitdir}/osbuild-local-worker.socket
|
%{_unitdir}/osbuild-local-worker.socket
|
||||||
%{_unitdir}/osbuild-remote-worker.socket
|
%{_unitdir}/osbuild-remote-worker.socket
|
||||||
%{_sysusersdir}/osbuild-composer.conf
|
%{_sysusersdir}/osbuild-composer.conf
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,9 @@ objects:
|
||||||
- name: composer-api
|
- name: composer-api
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
containerPort: ${{COMPOSER_API_PORT}}
|
containerPort: ${{COMPOSER_API_PORT}}
|
||||||
|
- name: prometheus
|
||||||
|
protocol: TCP
|
||||||
|
containerPort: ${{PROMETHEUS_PORT}}
|
||||||
- name: worker-api
|
- name: worker-api
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
containerPort: ${{WORKER_API_PORT}}
|
containerPort: ${{WORKER_API_PORT}}
|
||||||
|
|
@ -217,6 +220,10 @@ objects:
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
port: 80
|
port: 80
|
||||||
targetPort: ${{COMPOSER_API_PORT}}
|
targetPort: ${{COMPOSER_API_PORT}}
|
||||||
|
- name: prometheus
|
||||||
|
protocol: TCP
|
||||||
|
port: 8008
|
||||||
|
targetPort: ${{PROMETHEUS_PORT}}
|
||||||
selector:
|
selector:
|
||||||
app: composer
|
app: composer
|
||||||
|
|
||||||
|
|
@ -455,6 +462,9 @@ parameters:
|
||||||
name: COMPOSER_API_PORT
|
name: COMPOSER_API_PORT
|
||||||
required: true
|
required: true
|
||||||
value: "8080"
|
value: "8080"
|
||||||
|
- description: prometheus port
|
||||||
|
name: PROMETHEUS_PORT
|
||||||
|
value: "8008"
|
||||||
- description: worker-api port
|
- description: worker-api port
|
||||||
name: WORKER_API_PORT
|
name: WORKER_API_PORT
|
||||||
required: true
|
required: true
|
||||||
|
|
|
||||||
|
|
@ -416,6 +416,20 @@ function collectMetrics(){
|
||||||
echo "$METRICS_OUTPUT" | grep "^image_builder_composer_total_compose_requests" | cut -f2 -d' '
|
echo "$METRICS_OUTPUT" | grep "^image_builder_composer_total_compose_requests" | cut -f2 -d' '
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testNewMetricsPort(){
|
||||||
|
METRICS_OUTPUT1=$(curl \
|
||||||
|
--cacert /etc/osbuild-composer/ca-crt.pem \
|
||||||
|
--key /etc/osbuild-composer/client-key.pem \
|
||||||
|
--cert /etc/osbuild-composer/client-crt.pem \
|
||||||
|
https://localhost/metrics)
|
||||||
|
METRICS_OUTPUT2=$(curl http://localhost:8008/metrics)
|
||||||
|
|
||||||
|
COMPOSES1=$(echo "$METRICS_OUTPUT1" | grep "^image_builder_composer_total_compose_requests" | cut -f2 -d' ')
|
||||||
|
COMPOSES2=$(echo "$METRICS_OUTPUT2" | grep "^image_builder_composer_total_compose_requests" | cut -f2 -d' ')
|
||||||
|
|
||||||
|
test "$COMPOSES1" = "$COMPOSES2"
|
||||||
|
}
|
||||||
|
|
||||||
function sendCompose() {
|
function sendCompose() {
|
||||||
OUTPUT=$(mktemp)
|
OUTPUT=$(mktemp)
|
||||||
HTTPSTATUS=$(curl \
|
HTTPSTATUS=$(curl \
|
||||||
|
|
@ -570,6 +584,8 @@ sudo "${CONTAINER_RUNTIME}" exec "${DB_CONTAINER_NAME}" psql -U postgres -d osbu
|
||||||
"DELETE FROM jobs WHERE id = '$COMPOSE_ID'"
|
"DELETE FROM jobs WHERE id = '$COMPOSE_ID'"
|
||||||
sudo systemctl start "osbuild-remote-worker@localhost:8700.service"
|
sudo systemctl start "osbuild-remote-worker@localhost:8700.service"
|
||||||
|
|
||||||
|
testNewMetricsPort
|
||||||
|
|
||||||
# full integration case
|
# full integration case
|
||||||
INIT_COMPOSES="$(collectMetrics)"
|
INIT_COMPOSES="$(collectMetrics)"
|
||||||
sendCompose "$REQUEST_FILE"
|
sendCompose "$REQUEST_FILE"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue