Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions docs/en/02-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -882,3 +882,32 @@ export TRACING_SERVICE_NAME=seq-ui
+ **`TRACING_SAMPLER_PARAM`** *`float64`* *`required`*

Sampling rate parameter. Determines the fraction of requests that will be traced. Must be value between 0.0 and 1.0. For instance, use 0.1 to sample 10% of requests.

# Functions

The configuration supports a set of functions that are performed at the parsing stage.

> If you need to pass a literal string that begins with `<func>(`, you should escape the value with a
backslash: `\<func>(`.

## ENV
The `env(ENV_NAME)` function allows you to get environment variables.

Params:
+ **ENV_NAME** - name of the environment variable

Suppose you have environment variable `DB_PASS=my-pass`.

Raw config:
```yaml
server:
db:
pass: env(DB_PASS)
```

Final config:
```yaml
server:
db:
pass: my-pass
```
28 changes: 28 additions & 0 deletions docs/ru/02-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -883,3 +883,31 @@ export TRACING_SERVICE_NAME=seq-ui

Параметр сэмплера, определяющий долю запросов, которые будут отслеживаться. Допустимые значения - от 0.0 до 1.0
включительно. Например, 0.1 соответствует 10% запросов.

# Функции

Конфигурация поддерживает набор функций, которые выполняются на этапе парсинга.

> Если вам нужно использовать строку, которая начинается с `<func>(`, то вы должны экранировать ее с помощью обратной косой черты: `\<func>(`.

## ENV
Функция `env(ENV_NAME)` позволяет получать переменные окружения.

Параметры:
+ **ENV_NAME** - имя переменной окружения

Предположим, у вас есть переменная окружения `DB_PASS=my-pass`.

Исходный конфиг:
```yaml
server:
db:
pass: env(DB_PASS)
```

Итоговый конфиг:
```yaml
server:
db:
pass: my-pass
```
4 changes: 4 additions & 0 deletions internal/app/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"time"

"gopkg.in/yaml.v3"

"github.com/ozontech/seq-ui/internal/app/config/fnc"
)

const (
Expand Down Expand Up @@ -340,6 +342,8 @@ func FromFile(cfgPath string) (Config, error) {
return Config{}, fmt.Errorf("error parsing file: %s", err)
}

fnc.ApplyFuncs(&cfg)

proxyClientMode := cfg.Clients.ProxyClientMode
if proxyClientMode == "" {
cfg.Clients.ProxyClientMode = ProxyClientModeGRPC
Expand Down
28 changes: 28 additions & 0 deletions internal/app/config/fnc/env.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package fnc

import (
"errors"
"os"
)

type env struct {
args []string
}

func parseEnv(args []string) (*env, error) {
if len(args) != 1 {
return nil, errors.New("invalid args count")
}
if args[0] == "" {
return nil, errors.New("empty arg")
}
return &env{args: args}, nil
}

func (e *env) run() (string, error) {
env, ok := os.LookupEnv(e.args[0])
if !ok {
return "", errors.New("failed to lookup env")
}
return env, nil
}
92 changes: 92 additions & 0 deletions internal/app/config/fnc/env_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package fnc

import (
"os"
"testing"

"github.com/stretchr/testify/require"
)

func TestParseEnv(t *testing.T) {
cases := []struct {
name string

args []string
wantErr bool
}{
{
name: "ok",
args: []string{"TEST_ENV"},
},
{
name: "err_invalid_args_count_1",
args: []string{},
wantErr: true,
},
{
name: "err_invalid_args_count_2",
args: []string{"1", "2"},
wantErr: true,
},
{
name: "err_empty_arg",
args: []string{""},
wantErr: true,
},
}

for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
t.Parallel()

_, gotErr := parseEnv(c.args)
require.Equal(t, c.wantErr, gotErr != nil)
})
}
}

func TestEnvRun(t *testing.T) {
cases := []struct {
name string

args []string
envs [][2]string
want string
wantErr bool
}{
{
name: "ok",
args: []string{"TEST_ENV"},
envs: [][2]string{
{"TEST_ENV", "val"},
},
want: "val",
},
{
name: "err_lookup",
args: []string{"TEST_ENV2"},
wantErr: true,
},
}

for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
t.Parallel()

for _, e := range c.envs {
os.Setenv(e[0], e[1])
}

env, err := parseEnv(c.args)
require.NoError(t, err)

got, gotErr := env.run()
require.Equal(t, c.wantErr, gotErr != nil)
if c.wantErr {
return
}

require.Equal(t, c.want, got)
})
}
}
Loading
Loading