@@ -23,6 +23,7 @@ type LogContainersFilter struct {
23
23
LabelSelector string
24
24
FieldSelector string
25
25
ContainerNameRegexFilter string
26
+ MaxNamespaceContainers int
26
27
}
27
28
28
29
// LogMessagesFilter allows you to filter messages
@@ -40,6 +41,7 @@ type LogMessagesFilter struct {
40
41
// - namespace in which to search for pods
41
42
// - labelSelector to filter pods by their labels (keep empty to not filter)
42
43
// - containerNameRegexFilter to filter containers in the pod (keep empty to not filter)
44
+ // - maxNamespaceContainers to limit the containers in the given namespace (keep empty to not limit)
43
45
// - logMessagesFilter allows you to specify
44
46
// - messagesToSearch to filter the logs by substrings (case-insensitive)
45
47
// or regex (add `(?i)` in the beginning to make search case-insensitive). Leave nil to not filter.
@@ -73,6 +75,7 @@ func CollectLogsFromContainers( //nolint:gocyclo
73
75
return nil , err
74
76
}
75
77
78
+ var skippedContainers int
76
79
var records []record.Record
77
80
78
81
for i := range pods .Items {
@@ -84,6 +87,12 @@ func CollectLogsFromContainers( //nolint:gocyclo
84
87
containerNames = append (containerNames , pods .Items [i ].Spec .InitContainers [j ].Name )
85
88
}
86
89
90
+ containersLimited := containersFilter .MaxNamespaceContainers > 0 && len (records ) >= containersFilter .MaxNamespaceContainers
91
+ if containersLimited {
92
+ skippedContainers += len (containerNames )
93
+ continue
94
+ }
95
+
87
96
pod := & pods .Items [i ]
88
97
89
98
for _ , containerName := range containerNames {
@@ -97,29 +106,12 @@ func CollectLogsFromContainers( //nolint:gocyclo
97
106
}
98
107
}
99
108
100
- sinceSeconds := & messagesFilter . SinceSeconds
101
- if messagesFilter . SinceSeconds == 0 {
102
- sinceSeconds = nil
109
+ if containersLimited {
110
+ skippedContainers = len ( containerNames ) - containersFilter . MaxNamespaceContainers
111
+ break
103
112
}
104
113
105
- limitBytes := & messagesFilter .LimitBytes
106
- if messagesFilter .LimitBytes == 0 {
107
- limitBytes = nil
108
- }
109
-
110
- tailLines := & messagesFilter .TailLines
111
- if messagesFilter .TailLines == 0 {
112
- tailLines = nil
113
- }
114
-
115
- request := coreClient .Pods (containersFilter .Namespace ).GetLogs (pod .Name , & corev1.PodLogOptions {
116
- Container : containerName ,
117
- SinceSeconds : sinceSeconds ,
118
- LimitBytes : limitBytes ,
119
- TailLines : tailLines ,
120
- Previous : messagesFilter .Previous ,
121
- Timestamps : true ,
122
- })
114
+ request := coreClient .Pods (containersFilter .Namespace ).GetLogs (pod .Name , podLogOptions (containerName , messagesFilter ))
123
115
124
116
logs , err := filterLogs (ctx , request , messagesFilter .MessagesToSearch , messagesFilter .IsRegexSearch )
125
117
if err != nil {
@@ -139,6 +131,11 @@ func CollectLogsFromContainers( //nolint:gocyclo
139
131
klog .Infof ("no pods in %v namespace were found" , containersFilter .Namespace )
140
132
}
141
133
134
+ if skippedContainers > 0 {
135
+ return records , fmt .Errorf ("skipping %d containers on namespace %s (max: %d)" ,
136
+ skippedContainers , containersFilter .Namespace , containersFilter .MaxNamespaceContainers )
137
+ }
138
+
142
139
return records , nil
143
140
}
144
141
@@ -198,3 +195,29 @@ func FilterLogFromScanner(scanner *bufio.Scanner, messagesToSearch []string, reg
198
195
199
196
return strings .Join (result , "\n " ), nil
200
197
}
198
+
199
+ func podLogOptions (containerName string , messagesFilter LogMessagesFilter ) * corev1.PodLogOptions {
200
+ sinceSeconds := & messagesFilter .SinceSeconds
201
+ if messagesFilter .SinceSeconds == 0 {
202
+ sinceSeconds = nil
203
+ }
204
+
205
+ limitBytes := & messagesFilter .LimitBytes
206
+ if messagesFilter .LimitBytes == 0 {
207
+ limitBytes = nil
208
+ }
209
+
210
+ tailLines := & messagesFilter .TailLines
211
+ if messagesFilter .TailLines == 0 {
212
+ tailLines = nil
213
+ }
214
+
215
+ return & corev1.PodLogOptions {
216
+ Container : containerName ,
217
+ SinceSeconds : sinceSeconds ,
218
+ LimitBytes : limitBytes ,
219
+ TailLines : tailLines ,
220
+ Previous : messagesFilter .Previous ,
221
+ Timestamps : true ,
222
+ }
223
+ }
0 commit comments