Compare commits
14 Commits
30b3fc555a
...
e1d9acb980
Author | SHA1 | Date |
---|---|---|
vfebvre | e1d9acb980 | |
vfebvre | f8be2c08d6 | |
wpetit | bc7422a50c | |
wpetit | 9d32551ec5 | |
wpetit | ded6d179c1 | |
Philippe Caseiro | 6f4ee0ebd1 | |
Philippe Caseiro | 1375c9b317 | |
Philippe Caseiro | 53a0d26a47 | |
Philippe Caseiro | 87354ef0d4 | |
Philippe Caseiro | 8560041598 | |
Philippe Caseiro | 0611cc9f70 | |
wpetit | 734ed64e8e | |
wpetit | c8fc143efa | |
wpetit | f91c14e5d4 |
|
@ -6,9 +6,11 @@
|
||||||
## Exemples
|
## Exemples
|
||||||
|
|
||||||
- [(FR) - Exemple de déploiement multi-noeuds](../misc/docker-compose/README.md)
|
- [(FR) - Exemple de déploiement multi-noeuds](../misc/docker-compose/README.md)
|
||||||
|
|
||||||
## Référence
|
## Référence
|
||||||
|
|
||||||
- [(FR) - Layers](./fr/references/layers/README.md)
|
- [(FR) - Layers](./fr/references/layers/README.md)
|
||||||
|
- [(FR) - Métriques](./fr/references/metrics.md)
|
||||||
- [(FR) - Fichier de configuration](../misc/packaging/common/config.yml)
|
- [(FR) - Fichier de configuration](../misc/packaging/common/config.yml)
|
||||||
- [(FR) - API d'administration](./fr/references/admin_api.md)
|
- [(FR) - API d'administration](./fr/references/admin_api.md)
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,10 @@ Ce layer permet de bloquer l'accès à un site (ou une section de celui ci) cibl
|
||||||
|
|
||||||
Voir le [fichier de configuration de référence](../../../../misc/packaging/common/config.yml), section `layers.circuitbreaker` pour voir les options permettant de personnaliser le chemin du répertoire contenant les templates.
|
Voir le [fichier de configuration de référence](../../../../misc/packaging/common/config.yml), section `layers.circuitbreaker` pour voir les options permettant de personnaliser le chemin du répertoire contenant les templates.
|
||||||
|
|
||||||
### Schéma
|
## Schéma
|
||||||
|
|
||||||
Voir le [schéma JSON](../../../../internal/proxy/director/layer/circuitbreaker/layer-options.json).
|
Voir le [schéma JSON](../../../../internal/proxy/director/layer/circuitbreaker/layer-options.json).
|
||||||
|
|
||||||
|
## Métriques
|
||||||
|
|
||||||
|
_Aucune [métrique Prometheus](../metrics.md) n'est exportée par ce layer._
|
|
@ -30,6 +30,34 @@ Ce layer permet d'ajouter un mécanisme de file d'attente dynamique au proxy ass
|
||||||
|
|
||||||
Par exemple, si vous souhaitez limiter votre file à l'ensemble d'une section "`/blog`" d'un site, vous pouvez déclarer la valeur `["*/blog*"]`. Les autres URLs du site ne seront pas affectées par cette file d'attente.
|
Par exemple, si vous souhaitez limiter votre file à l'ensemble d'une section "`/blog`" d'un site, vous pouvez déclarer la valeur `["*/blog*"]`. Les autres URLs du site ne seront pas affectées par cette file d'attente.
|
||||||
|
|
||||||
### Schéma
|
## Schéma
|
||||||
|
|
||||||
Voir le [schéma JSON](../../../../internal/proxy/director/layer/queue/schema/layer-options.json).
|
Voir le [schéma JSON](../../../../internal/proxy/director/layer/queue/schema/layer-options.json).
|
||||||
|
|
||||||
|
## Métriques
|
||||||
|
|
||||||
|
Les [métriques Prometheus](../metrics.md) suivantes sont exposées par ce layer.
|
||||||
|
|
||||||
|
### `bouncer_layer_queue_capacity{layer=<layerName>,proxy=<proxyName>}`
|
||||||
|
|
||||||
|
- **Type:** `gauge`
|
||||||
|
- **Description**: Capacité maximale de la queue
|
||||||
|
- **Exemple**
|
||||||
|
|
||||||
|
```
|
||||||
|
# HELP bouncer_layer_queue_capacity Bouncer's queue layer capacity
|
||||||
|
# TYPE bouncer_layer_queue_capacity gauge
|
||||||
|
bouncer_layer_queue_capacity{layer="queue",proxy="cadoles"} 2
|
||||||
|
```
|
||||||
|
|
||||||
|
### `bouncer_layer_queue_sessions{layer=<layerName>,proxy=<proxyName>}`
|
||||||
|
|
||||||
|
- **Type:** `gauge`
|
||||||
|
- **Description**: Nombre courant de sessions ouvertes
|
||||||
|
- **Exemple**
|
||||||
|
|
||||||
|
```
|
||||||
|
# HELP bouncer_layer_queue_sessions Bouncer's queue layer current sessions
|
||||||
|
# TYPE bouncer_layer_queue_sessions gauge
|
||||||
|
bouncer_layer_queue_sessions{layer="queue",proxy="cadoles"} 3
|
||||||
|
```
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Métriques
|
||||||
|
|
||||||
|
Bouncer expose un certain nombre de métriques Prometheus sur le serveur proxy ainsi que sur le serveur d'administration. Ces métriques sont par défaut accessibles sur `/.bouncer/metrics`.
|
||||||
|
|
||||||
|
Il est possible de configurer le point d'entrée de ces métriques ainsi que d'ajouter une authentification de type `Basic Auth` [via la configuration](../../../misc/packaging/common/config.yml) (voir les clés `admin.metrics` et `proxy.metrics`).
|
||||||
|
|
||||||
|
Outre les métriques par défaut fournies par la librairie [Prometheus](https://prometheus.io/docs/guides/go-application/#instrumenting-a-go-application-for-prometheus), les serveurs Bouncer exposent également des métriques propres.
|
||||||
|
|
||||||
|
Chaque layer associé à un proxy peut également ses propres métriques spécifiques. [Voir la page de documentation](./layers/README.md) de chaque layer pour plus d'informations.
|
||||||
|
|
||||||
|
## Métriques spécifiques
|
||||||
|
|
||||||
|
### Serveur proxy
|
||||||
|
|
||||||
|
#### `bouncer_proxy_director_proxy_requests_total{proxy=<proxyName>}`
|
||||||
|
|
||||||
|
- **Type:** `counter`
|
||||||
|
- **Description**: Nombre total de requêtes ayant transité par le proxy
|
||||||
|
- **Exemple**
|
||||||
|
|
||||||
|
```
|
||||||
|
# HELP bouncer_proxy_director_proxy_requests_total Bouncer proxy total requests
|
||||||
|
# TYPE bouncer_proxy_director_proxy_requests_total counter
|
||||||
|
bouncer_proxy_director_proxy_requests_total{proxy="cadoles"} 64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Serveur d'administration
|
||||||
|
|
||||||
|
_Pas de métrique supplémentaire._
|
|
@ -5,15 +5,28 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/admin"
|
"forge.cadoles.com/cadoles/bouncer/internal/admin"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/auth/jwt"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/command/common"
|
"forge.cadoles.com/cadoles/bouncer/internal/command/common"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/jwk"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/setup"
|
"forge.cadoles.com/cadoles/bouncer/internal/setup"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"gitlab.com/wpetit/goweb/logger"
|
"gitlab.com/wpetit/goweb/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
flagPrintDefaultToken = "print-default-token"
|
||||||
|
)
|
||||||
|
|
||||||
func RunCommand() *cli.Command {
|
func RunCommand() *cli.Command {
|
||||||
flags := common.Flags()
|
flags := append(
|
||||||
|
common.Flags(),
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: flagPrintDefaultToken,
|
||||||
|
Usage: "Generate and print a default writer token in console at startup",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "run",
|
Name: "run",
|
||||||
|
@ -36,6 +49,22 @@ func RunCommand() *cli.Command {
|
||||||
|
|
||||||
defer flushSentry()
|
defer flushSentry()
|
||||||
|
|
||||||
|
if printDefaultToken := ctx.Bool(flagPrintDefaultToken); printDefaultToken {
|
||||||
|
key, err := jwk.Generate(jwk.DefaultKeySize)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "could not generate default key")
|
||||||
|
}
|
||||||
|
|
||||||
|
token, err := jwt.GenerateToken(ctx.Context, key, string(conf.Admin.Auth.Issuer), "default-admin", jwt.Role(jwt.RoleWriter))
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.SetLevel(logger.LevelInfo)
|
||||||
|
logger.Info(ctx.Context, "default writer token", logger.F("token", token))
|
||||||
|
logger.SetLevel(logger.Level(conf.Logger.Level))
|
||||||
|
}
|
||||||
|
|
||||||
srv := admin.NewServer(
|
srv := admin.NewServer(
|
||||||
admin.WithServerConfig(conf.Admin),
|
admin.WithServerConfig(conf.Admin),
|
||||||
admin.WithRedisConfig(conf.Redis),
|
admin.WithRedisConfig(conf.Redis),
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
# K6 - Load Test
|
||||||
|
|
||||||
|
Very basic load testing script for [k6](https://k6.io/).
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
```shell
|
||||||
|
k6 run cadoles-loadtest.js
|
||||||
|
```
|
|
@ -0,0 +1,29 @@
|
||||||
|
import { check } from 'k6';
|
||||||
|
import { browser } from 'k6/experimental/browser';
|
||||||
|
|
||||||
|
export const options = {
|
||||||
|
scenarios: {
|
||||||
|
browser: {
|
||||||
|
vus: 10,
|
||||||
|
iterations: 100,
|
||||||
|
executor: 'shared-iterations',
|
||||||
|
options: {
|
||||||
|
browser: {
|
||||||
|
type: 'chromium',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function () {
|
||||||
|
const page = browser.newPage();
|
||||||
|
try {
|
||||||
|
await page.goto('https://www.cadoles.com');
|
||||||
|
check(page, {
|
||||||
|
'Homepage loaded': p => p.locator('h1').textContent().trim() == 'La liberté est un choix',
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
page.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -159,7 +159,7 @@ logger:
|
||||||
# 2 - WARNING
|
# 2 - WARNING
|
||||||
# 3 - ERROR
|
# 3 - ERROR
|
||||||
# 4 - FATAL
|
# 4 - FATAL
|
||||||
level: 1
|
level: 2
|
||||||
# Format des logs, "human" ou "json"
|
# Format des logs, "human" ou "json"
|
||||||
format: human
|
format: human
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue