Count iptables lines as we write them

This commit is contained in:
Dan Winship 2022-02-19 11:27:57 -05:00
parent ffd6482eed
commit e7bae9df81
3 changed files with 20 additions and 11 deletions

View File

@ -1507,10 +1507,8 @@ func (proxier *Proxier) syncProxyRules() {
"-j", "ACCEPT", "-j", "ACCEPT",
) )
numberFilterIptablesRules := utilproxy.CountBytesLines(proxier.filterRules.Bytes()) metrics.IptablesRulesTotal.WithLabelValues(string(utiliptables.TableFilter)).Set(float64(proxier.filterRules.Lines()))
metrics.IptablesRulesTotal.WithLabelValues(string(utiliptables.TableFilter)).Set(float64(numberFilterIptablesRules)) metrics.IptablesRulesTotal.WithLabelValues(string(utiliptables.TableNAT)).Set(float64(proxier.natRules.Lines()))
numberNatIptablesRules := utilproxy.CountBytesLines(proxier.natRules.Bytes())
metrics.IptablesRulesTotal.WithLabelValues(string(utiliptables.TableNAT)).Set(float64(numberNatIptablesRules))
// Write the end-of-table markers. // Write the end-of-table markers.
proxier.filterRules.Write("COMMIT") proxier.filterRules.Write("COMMIT")

View File

@ -522,6 +522,7 @@ func GetClusterIPByFamily(ipFamily v1.IPFamily, service *v1.Service) string {
type LineBuffer struct { type LineBuffer struct {
b bytes.Buffer b bytes.Buffer
lines int
} }
// Write takes a list of arguments, each a string or []string, joins all the // Write takes a list of arguments, each a string or []string, joins all the
@ -547,22 +548,34 @@ func (buf *LineBuffer) Write(args ...interface{}) {
} }
} }
buf.b.WriteByte('\n') buf.b.WriteByte('\n')
buf.lines++
} }
// WriteBytes writes bytes to buffer, and terminates with newline. // WriteBytes writes bytes to buffer, and terminates with newline.
func (buf *LineBuffer) WriteBytes(bytes []byte) { func (buf *LineBuffer) WriteBytes(bytes []byte) {
buf.b.Write(bytes) buf.b.Write(bytes)
buf.b.WriteByte('\n') buf.b.WriteByte('\n')
buf.lines++
} }
// Reset clears buf
func (buf *LineBuffer) Reset() { func (buf *LineBuffer) Reset() {
buf.b.Reset() buf.b.Reset()
buf.lines = 0
} }
// Bytes returns the contents of buf as a []byte
func (buf *LineBuffer) Bytes() []byte { func (buf *LineBuffer) Bytes() []byte {
return buf.b.Bytes() return buf.b.Bytes()
} }
// Lines returns the number of lines in buf. Note that more precisely, this returns the
// number of times Write() or WriteBytes() was called; it assumes that you never wrote
// any newlines to the buffer yourself.
func (buf *LineBuffer) Lines() int {
return buf.lines
}
// RevertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only // RevertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only
// closes the ports opened in this sync. // closes the ports opened in this sync.
func RevertPorts(replacementPortsMap, originalPortsMap map[netutils.LocalPort]netutils.Closeable) { func RevertPorts(replacementPortsMap, originalPortsMap map[netutils.LocalPort]netutils.Closeable) {
@ -574,8 +587,3 @@ func RevertPorts(replacementPortsMap, originalPortsMap map[netutils.LocalPort]ne
} }
} }
} }
// CountBytesLines counts the number of lines in a bytes slice
func CountBytesLines(b []byte) int {
return bytes.Count(b, []byte{'\n'})
}

View File

@ -1185,6 +1185,9 @@ func TestLineBufferWrite(t *testing.T) {
if want, got := testCase.expected, string(testBuffer.Bytes()); !strings.EqualFold(want, got) { if want, got := testCase.expected, string(testBuffer.Bytes()); !strings.EqualFold(want, got) {
t.Fatalf("write word is %v\n expected: %q, got: %q", testCase.input, want, got) t.Fatalf("write word is %v\n expected: %q, got: %q", testCase.input, want, got)
} }
if testBuffer.Lines() != 1 {
t.Fatalf("expected 1 line, got: %d", testBuffer.Lines())
}
}) })
} }
} }
@ -1267,7 +1270,7 @@ func TestWriteCountLines(t *testing.T) {
for i := 0; i < testCase.expected; i++ { for i := 0; i < testCase.expected; i++ {
testBuffer.Write(randSeq()) testBuffer.Write(randSeq())
} }
n := CountBytesLines(testBuffer.Bytes()) n := testBuffer.Lines()
if n != testCase.expected { if n != testCase.expected {
t.Fatalf("lines expected: %d, got: %d", testCase.expected, n) t.Fatalf("lines expected: %d, got: %d", testCase.expected, n)
} }