Skip to content

Commit c663ae6

Browse files
committed
Refactor logrotate config creation.
Refactor logic around adding collector to postgres instance pod.
1 parent 02249f8 commit c663ae6

File tree

4 files changed

+77
-47
lines changed

4 files changed

+77
-47
lines changed

internal/collector/config.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ type Pipeline struct {
5555
Receivers []ComponentID
5656
}
5757

58+
// LogrotateConfig represents the configurable pieces of a log rotate config
59+
// that can vary based on the specific component whose logs are being rotated
60+
type LogrotateConfig struct {
61+
LogFiles []string
62+
PostrotateScript string
63+
}
64+
5865
func (c *Config) ToYAML() (string, error) {
5966
const yamlGeneratedWarning = "" +
6067
"# Generated by postgres-operator. DO NOT EDIT.\n" +
@@ -116,10 +123,10 @@ func NewConfig(spec *v1beta1.InstrumentationSpec) *Config {
116123
return config
117124
}
118125

119-
// AddLogrotateConfig generates a logrotate configuration and adds it to the
120-
// provided configmap
121-
func AddLogrotateConfig(ctx context.Context, spec *v1beta1.InstrumentationSpec,
122-
outInstanceConfigMap *corev1.ConfigMap, logFilesToRotate []string, postrotateScript string,
126+
// AddLogrotateConfigs generates a logrotate configuration for each LogrotateConfig
127+
// provided via the configs parameter and adds them to the provided configmap.
128+
func AddLogrotateConfigs(ctx context.Context, spec *v1beta1.InstrumentationSpec,
129+
outInstanceConfigMap *corev1.ConfigMap, configs []LogrotateConfig,
123130
) error {
124131
var err error
125132
var retentionPeriod *v1beta1.Duration
@@ -139,25 +146,29 @@ func AddLogrotateConfig(ctx context.Context, spec *v1beta1.InstrumentationSpec,
139146
}
140147
}
141148

142-
outInstanceConfigMap.Data["logrotate.conf"] = generateLogrotateConfig(logFilesToRotate,
143-
retentionPeriod, postrotateScript)
149+
logrotateConfig := ""
150+
for _, config := range configs {
151+
logrotateConfig += generateLogrotateConfig(config, retentionPeriod)
152+
}
153+
154+
outInstanceConfigMap.Data["logrotate.conf"] = logrotateConfig
144155

145156
return err
146157
}
147158

148159
// generateLogrotateConfig generates a configuration string for logrotate based
149160
// on the provided full log file path, retention period, and postrotate script
150-
func generateLogrotateConfig(logFilesToRotate []string, retentionPeriod *v1beta1.Duration,
151-
postrotateScript string,
161+
func generateLogrotateConfig(
162+
config LogrotateConfig, retentionPeriod *v1beta1.Duration,
152163
) string {
153164
number, interval := parseDurationForLogrotate(retentionPeriod)
154165

155166
return fmt.Sprintf(
156167
logrotateConfigFormatString,
157-
strings.Join(logFilesToRotate, " "),
168+
strings.Join(config.LogFiles, " "),
158169
number,
159170
interval,
160-
postrotateScript,
171+
config.PostrotateScript,
161172
)
162173
}
163174

internal/collector/config_test.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,16 @@ service:
6666

6767
func TestGenerateLogrotateConfig(t *testing.T) {
6868
for _, tt := range []struct {
69-
logFilePath string
70-
retentionPeriod string
71-
postrotateScript string
72-
result string
69+
config LogrotateConfig
70+
retentionPeriod string
71+
result string
7372
}{
7473
{
75-
logFilePath: "/this/is/a/file.path",
76-
retentionPeriod: "12h",
77-
postrotateScript: "echo 'Hello, World'",
74+
config: LogrotateConfig{
75+
LogFiles: []string{"/this/is/a/file.path"},
76+
PostrotateScript: "echo 'Hello, World'",
77+
},
78+
retentionPeriod: "12h",
7879
result: `/this/is/a/file.path {
7980
rotate 12
8081
missingok
@@ -89,9 +90,11 @@ func TestGenerateLogrotateConfig(t *testing.T) {
8990
`,
9091
},
9192
{
92-
logFilePath: "/tmp/test.log",
93-
retentionPeriod: "5 days",
94-
postrotateScript: "",
93+
config: LogrotateConfig{
94+
LogFiles: []string{"/tmp/test.log"},
95+
PostrotateScript: "",
96+
},
97+
retentionPeriod: "5 days",
9598
result: `/tmp/test.log {
9699
rotate 5
97100
missingok
@@ -106,10 +109,12 @@ func TestGenerateLogrotateConfig(t *testing.T) {
106109
`,
107110
},
108111
{
109-
logFilePath: "/tmp/test.log",
110-
retentionPeriod: "5wk",
111-
postrotateScript: "pkill -HUP --exact pgbouncer",
112-
result: `/tmp/test.log {
112+
config: LogrotateConfig{
113+
LogFiles: []string{"/tmp/test.csv", "/tmp/test.json"},
114+
PostrotateScript: "pkill -HUP --exact pgbouncer",
115+
},
116+
retentionPeriod: "5wk",
117+
result: `/tmp/test.csv /tmp/test.json {
113118
rotate 35
114119
missingok
115120
sharedscripts
@@ -126,7 +131,7 @@ func TestGenerateLogrotateConfig(t *testing.T) {
126131
t.Run(tt.retentionPeriod, func(t *testing.T) {
127132
duration, err := v1beta1.NewDuration(tt.retentionPeriod)
128133
assert.NilError(t, err)
129-
result := generateLogrotateConfig(tt.logFilePath, duration, tt.postrotateScript)
134+
result := generateLogrotateConfig(tt.config, duration)
130135
assert.Equal(t, tt.result, result)
131136
})
132137
}

internal/controller/postgrescluster/instance.go

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,26 +1200,32 @@ func (r *Reconciler) reconcileInstance(
12001200
spec, instanceCertificates, instanceConfigMap, &instance.Spec.Template)
12011201
}
12021202

1203+
// If either OpenTelemetry feature is enabled, we want to add the collector config to the pod
12031204
if err == nil &&
1204-
(feature.Enabled(ctx, feature.OpenTelemetryLogs) && !feature.Enabled(ctx, feature.OpenTelemetryMetrics)) {
1205-
1206-
// TODO: Setting the includeLogrotate argument to false for now. This
1207-
// should be changed when we implement log rotation for postgres
1208-
collector.AddToPod(ctx, cluster.Spec.Instrumentation, cluster.Spec.ImagePullPolicy, instanceConfigMap, &instance.Spec.Template.Spec,
1209-
[]corev1.VolumeMount{postgres.DataVolumeMount()}, "", true)
1210-
}
1211-
1212-
if err == nil &&
1213-
feature.Enabled(ctx, feature.OpenTelemetryMetrics) {
1214-
1215-
monitoringUserSecret := &corev1.Secret{ObjectMeta: naming.MonitoringUserSecret(cluster)}
1216-
err = errors.WithStack(
1217-
r.Client.Get(ctx, client.ObjectKeyFromObject(monitoringUserSecret), monitoringUserSecret))
1205+
(feature.Enabled(ctx, feature.OpenTelemetryLogs) || feature.Enabled(ctx, feature.OpenTelemetryMetrics)) {
1206+
1207+
// If the OpenTelemetryMetrics feature is enabled, we need to get the pgpassword from the
1208+
// monitoring user secret
1209+
pgPassword := ""
1210+
if feature.Enabled(ctx, feature.OpenTelemetryMetrics) {
1211+
monitoringUserSecret := &corev1.Secret{ObjectMeta: naming.MonitoringUserSecret(cluster)}
1212+
// Create new err variable to avoid abandoning the rest of the reconcile loop if there
1213+
// is an error getting the monitoring user secret
1214+
err := errors.WithStack(
1215+
r.Client.Get(ctx, client.ObjectKeyFromObject(monitoringUserSecret), monitoringUserSecret))
1216+
if err == nil {
1217+
pgPassword = string(monitoringUserSecret.Data["password"])
1218+
}
1219+
}
12181220

1219-
if err == nil {
1220-
collector.AddToPod(ctx, cluster.Spec.Instrumentation, cluster.Spec.ImagePullPolicy, instanceConfigMap, &instance.Spec.Template.Spec,
1221-
[]corev1.VolumeMount{postgres.DataVolumeMount()}, string(monitoringUserSecret.Data["password"]), false)
1221+
// If the OpenTelemetryLogging feature is enabled, we need to set includeLogrotate to true
1222+
includeLogrotate := false
1223+
if feature.Enabled(ctx, feature.OpenTelemetryLogs) {
1224+
includeLogrotate = true
12221225
}
1226+
1227+
collector.AddToPod(ctx, cluster.Spec.Instrumentation, cluster.Spec.ImagePullPolicy, instanceConfigMap, &instance.Spec.Template.Spec,
1228+
[]corev1.VolumeMount{postgres.DataVolumeMount()}, pgPassword, includeLogrotate)
12231229
}
12241230

12251231
// Add postgres-exporter to the instance Pod spec
@@ -1429,12 +1435,16 @@ func (r *Reconciler) reconcileInstanceConfigMap(
14291435
}
14301436
// If OTel logging is enabled, add logrotate config
14311437
if err == nil && otelConfig != nil && feature.Enabled(ctx, feature.OpenTelemetryLogs) {
1432-
logFilesToRotate := []string{
1438+
postgresFilesToRotate := []string{
14331439
postgres.LogDirectory() + "/postgresql.json",
14341440
postgres.LogDirectory() + "/postgresql.csv",
14351441
}
1436-
err = collector.AddLogrotateConfig(ctx, cluster.Spec.Instrumentation, instanceConfigMap,
1437-
logFilesToRotate, collector.PostgresPostRotateScript)
1442+
postgresLogrotateConfig := collector.LogrotateConfig{
1443+
LogFiles: postgresFilesToRotate,
1444+
PostrotateScript: collector.PostgresPostRotateScript,
1445+
}
1446+
err = collector.AddLogrotateConfigs(ctx, cluster.Spec.Instrumentation, instanceConfigMap,
1447+
[]collector.LogrotateConfig{postgresLogrotateConfig})
14381448
}
14391449
if err == nil {
14401450
err = patroni.InstanceConfigMap(ctx, cluster, spec, instanceConfigMap)

internal/controller/postgrescluster/pgbouncer.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,12 @@ func (r *Reconciler) reconcilePGBouncerConfigMap(
105105
}
106106
// If OTel logging is enabled, add logrotate config
107107
if err == nil && otelConfig != nil && feature.Enabled(ctx, feature.OpenTelemetryLogs) {
108-
err = collector.AddLogrotateConfig(ctx, cluster.Spec.Instrumentation, configmap,
109-
[]string{naming.PGBouncerFullLogPath}, collector.PGBouncerPostRotateScript)
108+
logrotateConfig := collector.LogrotateConfig{
109+
LogFiles: []string{naming.PGBouncerFullLogPath},
110+
PostrotateScript: collector.PGBouncerPostRotateScript,
111+
}
112+
err = collector.AddLogrotateConfigs(ctx, cluster.Spec.Instrumentation, configmap,
113+
[]collector.LogrotateConfig{logrotateConfig})
110114
}
111115
if err == nil {
112116
err = errors.WithStack(r.apply(ctx, configmap))

0 commit comments

Comments
 (0)