Compare commits
12 Commits
e1d9acb980
...
30b3fc555a
Author | SHA1 | Date |
---|---|---|
vfebvre | 30b3fc555a | |
vfebvre | f38860e8ef | |
wpetit | 2edd795ab8 | |
wpetit | 4d1ca1787c | |
wpetit | 6f61073d1f | |
Philippe Caseiro | 017e1e8a7c | |
Philippe Caseiro | 086564b429 | |
Philippe Caseiro | 2b37735818 | |
Philippe Caseiro | f2755023bd | |
Philippe Caseiro | 0c9a387d42 | |
Philippe Caseiro | 9ab785e285 | |
Philippe Caseiro | bcc73a97cc |
|
@ -6,11 +6,9 @@
|
||||||
## 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,10 +32,6 @@ 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,34 +30,6 @@ 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
|
|
||||||
```
|
|
|
@ -1,29 +0,0 @@
|
||||||
# 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,28 +5,15 @@ 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 := append(
|
flags := common.Flags()
|
||||||
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",
|
||||||
|
@ -49,22 +36,6 @@ 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),
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
# K6 - Load Test
|
|
||||||
|
|
||||||
Very basic load testing script for [k6](https://k6.io/).
|
|
||||||
|
|
||||||
## How to run
|
|
||||||
|
|
||||||
```shell
|
|
||||||
k6 run cadoles-loadtest.js
|
|
||||||
```
|
|
|
@ -1,29 +0,0 @@
|
||||||
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: 2
|
level: 1
|
||||||
# Format des logs, "human" ou "json"
|
# Format des logs, "human" ou "json"
|
||||||
format: human
|
format: human
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue