Skip to content

Conversation

@jorbaum
Copy link
Contributor

@jorbaum jorbaum commented Jan 5, 2026

Description

Addresses #711 :

  • Support both ?include-log-types= and ?exclude-log-types
  • Throw error in case both are configured. Do not throw an error on misconfigured values for the new config option (consistent with previous HTTP query param usage in binding config), but log a warning (new).

I still need to verify this, but I think a feature flag is not necessary as I tried to make string parsing more efficient by:

  • running only when source type tag and log type filter is present
  • strings.IndexByte might take some time, but it is used only with a single char / and strings.IndexByte() should be more efficient than strings.Index()
  • Looking up content in a map logTypePrefixes rather than in each log line, which should be more efficient

Use both include and exclude log filter

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

Testing performed?

  • Unit tests
  • Integration tests
  • Acceptance tests

Checklist:

  • This PR is being made against the main branch, or relevant version branch
  • I have made corresponding changes to the documentation
  • I have added testing for my changes

@jorbaum jorbaum force-pushed the add-log-type-filter branch from 43b0941 to 9fcc372 Compare January 8, 2026 09:41
@jorbaum jorbaum force-pushed the add-log-type-filter branch from 9fcc372 to bccd92c Compare January 8, 2026 09:43
Copy link
Contributor

@chombium chombium left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jorbaum Thanks for the changes.

Generally it looks good, but I have some smaller objections which should be addressed.

DrainData DrainData `json:"type,omitempty"`
OmitMetadata bool
InternalTls bool
LogFilter *LogTypeSet
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think that this has to be a pointer.

Copy link
Contributor Author

@jorbaum jorbaum Jan 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried that at first, but in manager.go line 45 Binding is used as a map key:

	sourceDrainMap    map[string]map[syslog.Binding]drainHolder

My understanding is that maps in Go are not comparable, so adding LogTypeSet (which is a map[LogType]struct{}) to the Binding struct makes it non-comparable.

AFAICS the alternative to using a pointer would be to implement a custom comparable key for the map, but using a pointer seemed simpler to me.

default:
// Unknown log type, skip it
// TODO add unit test for unknown log type
d.log.Printf("Unknown log type '%s' in log type filter, ignoring", logType)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there is a log message here and an app owner wrongly configures the drain, than for every app instance and every app log, a log ,message will be written.

The filter settings should be validated upfront and we should not end up in this situation. At this point we should only have valid drain configuration.
I guess we have to bring in #633 first and than this change.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is that this code does not run for every log message, but only parsing the syslog drain config. I intentionally left logging out of filtering_drain_writer.go to avoid creating a log for each app log.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After discussing with @chombium we concluded that yhis log gets created for each wrongly configured value in the log types of each syslog drain. This is emitted every few seconds on each VM within cloud foundry. While this is better than for each log line, we would still keep log load at a minimum.

To address this I now made sure to log at most one log line in this method.

set := make(syslog.LogTypeSet, len(logTypes))

for _, logType := range logTypes {
logType = strings.ToLower(strings.TrimSpace(logType))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The query string in the URL is case sensitive. We should only accept lowercase and not convert eVerY POssibLE string to lower case.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did so.

Still, I wonder if we should be strict here about this. Not caring about casing might bring us some benefits as this might be something that users accidentally misconfigure. It should not hurt much to support both I think.

@chombium
Copy link
Contributor

chombium commented Jan 9, 2026

@ZPascal Wdyt about this PR? It addresses #711

@jorbaum
Copy link
Contributor Author

jorbaum commented Jan 12, 2026

@chombium I left a bunch of replies for points that are not yet clear to me. All the rest look good.

Thanks for the thorough review! You found a bunch of nice things.

Copy link
Contributor Author

@jorbaum jorbaum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Worked in some comments.

set := make(syslog.LogTypeSet, len(logTypes))

for _, logType := range logTypes {
logType = strings.ToLower(strings.TrimSpace(logType))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did so.

Still, I wonder if we should be strict here about this. Not caring about casing might bring us some benefits as this might be something that users accidentally misconfigure. It should not hurt much to support both I think.

Copy link
Contributor Author

@jorbaum jorbaum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Worked in most comments. Still 2 left to clarify.

default:
// Unknown log type, skip it
// TODO add unit test for unknown log type
d.log.Printf("Unknown log type '%s' in log type filter, ignoring", logType)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After discussing with @chombium we concluded that yhis log gets created for each wrongly configured value in the log types of each syslog drain. This is emitted every few seconds on each VM within cloud foundry. While this is better than for each log line, we would still keep log load at a minimum.

To address this I now made sure to log at most one log line in this method.

@jorbaum
Copy link
Contributor Author

jorbaum commented Jan 19, 2026

Feel free to take another look at it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

2 participants