-
Notifications
You must be signed in to change notification settings - Fork 257
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dynamic pipelines - a new foreach
block
#1480
base: main
Are you sure you want to change the base?
Conversation
I really like the idea of it being component based. I am comparing to terraform's for_each, where you make a "template" resource and have an argument in there which tells it how to expand it into multiple components:
I really like the notion that this is a single component that would be "expanded" based on the evaluation of some list. It could be a built-in component or a previously imported dynamic component. I am not sure how naming of the expanded components would work, but we could figure something out. I'm also not sure if it is possible to reference a dynamically created subcomponent from elsewhere in the config. |
This PR has not had any activity in the past 30 days, so the |
It looks likely that we are going to go with the As a second step, we will need to figure out how to refer to the values that are currently iterated on. Should we actually have a By the way, apparently the Collector already has something like dynamic pipelines. There are observer extensions which you can hook up to a recover creator component. For example, you can have a k8s observer which crates a receiver for each discovered pod. |
dd602e6
to
378cb04
Compare
378cb04
to
cc02bfc
Compare
d8b2547
to
d1591b1
Compare
e8cd817
to
8217e86
Compare
b041704
to
421204a
Compare
💻 Deploy preview available: https://deploy-preview-alloy-1480-zb444pucvq-vp.a.run.app/docs/alloy/latest/ |
foreach
block
* summation1 only sends during run() * summation2 tracks the sum via metrics instead of an export
* add stability lvl to config blocks * fix import git test
* Add tests for types other than integers * Minor fixes to string_receiver * Add a foreach test for maps which contain maps
* Add docs for foreach * Apply suggestions from code review Co-authored-by: Clayton Cornell <[email protected]> * Add a shared experimental_feature snippet * Addressing PR feedback * Apply suggestions from code review Co-authored-by: William Dumont <[email protected]> --------- Co-authored-by: Clayton Cornell <[email protected]> Co-authored-by: William Dumont <[email protected]>
e16e3e3
to
417bd4d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fantastic work, gave it a first review and will go over it again. Added some comments on tests.
} | ||
|
||
func (fi *forEachChild) Hash() uint64 { | ||
fnvHash := fnv.New64a() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are we using two different hash functions? sha256 and fnv, though they dont collide in usage, it feels odd.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The runner pkg only needs a 64 bits hash but for the objects in the collection we use a 256 bits hash. I would be ok to use 64 bits for the items in the collection. A collision at this level could end up in missing metrics and duplicated metrics in unlucky scenarios but with 1000 items in the collection (which would be a lot for Alloy) the probability is 2.71×10-14. A collision in the runner pkg would be even worse so I'm not sure that the extra 256 hash security is needed but I also don't mind it so much because it should not matter much in terms of performance. @ptodev what do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IIUC, for items in the collection the hash is 256 bits since there could be lots of things in each item in a collection, and it gives us extra protection against collisions. For the foreach ID we use a 64 bit hash since it's just a string. IMO it's ok to use different hashes, but we do need to document why each situation uses a different one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we use the hash of the items in the collection for the foreachID and the foreachID as a key: https://github.com/grafana/alloy/pull/1480/files#diff-9cebda46e5a40368c4b76027ff2bda36114d2737124b5390aa35fa6435d79127R193
The 64 bits hash is used for the runner that wraps around the foreach to run it.
What's in an item in a collection should not matter. Whether the object has 3 or 30 fields, it should not have any influence on the collision I believe. The only difference would be the number of items in the collection and we would need billions of items for a collision to be likely.
I'm ok to keep it as it is and add a comment that we keep the 256 bits hash for extra security and that if one day it becomes a performance bottleneck it would be ok to use a 64 bits hash instead
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Small comments but overall fantastic!
Co-authored-by: Clayton Cornell <[email protected]>
Co-authored-by: Clayton Cornell <[email protected]>
PR Description
This is a proposal for starting up Alloy pipelines dynamically based on data in transit. For example, if a
discovery
component comes up with 10 targets, Alloy can start 10 sub-pipelines, each dealing with a different target.The PR consists of a a design doc in
docs/design/
and an experimental implementation. The user will have to have the "experimental" cmd flag turned on.Which issue(s) this PR fixes
Fixes #1443