Search code examples
kuberneteseventsrate-limitingargo-events

Having trouble getting rateLimit working in Argo Events sensor trigger


I'm trying to limit the number of Argo workflows started per minute in an Argo events sensor trigger using the rateLimit parameter as specified in https://argoproj.github.io/argo-events/sensors/more-about-sensors-and-triggers/. But no luck so far.

Here's a snippet of my sensor YAML test script:

apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: amqp-level0
spec:
  template:
    serviceAccountName: operate-workflow-sa
  dependencies:
    - name: test-dep
      eventSourceName: amqp-interval
      eventName: interval
  triggers:
    - rateLimit:
        unit: Minute
        requestsPerUnit: 5
    - template:
        name: amqp-workflow-trigger
        k8s:
          operation: create
          source:
            resource:
              apiVersion: argoproj.io/v1alpha1
              kind: Workflow
              ...

Without the rateLimit block, the sensor loads into k8s fine. But with that block, it doesn't run, and I see the following in the controller-manager logs:

{"level":"error","ts":1680700596.098304,"logger":"argo-events.eventbus-controller","caller":"sensor/controller.go:74","msg":"reconcile error","namespace":"argo-events","sensor":"amqp-level0","error":"trigger template can't be nil","stacktrace":"github.com/argoproj/argo-events/controllers/sensor.(*reconciler).Reconcile\n\t/home/runner/work/argo-events/argo-events/controllers/sensor/controller.go:74\nsigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Reconcile\n\t/home/runner/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.11.2/pkg/internal/controller/controller.go:114\nsigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler\n\t/home/runner/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.11.2/pkg/internal/controller/controller.go:311\nsigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem\n\t/home/runner/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.11.2/pkg/internal/controller/controller.go:266\nsigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start.func2.2\n\t/home/runner/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.11.2/pkg/internal/controller/controller.go:227"}

(Note the "trigger template can't be nil", which seems to be the issue, but I haven't figured out how to resolve.)

The Argo events installed is 1.7.6, and Argo is

> argo version
argo: v3.4.6
  BuildDate: 2023-03-31T19:53:49Z
  GitCommit: 988706dd131cf98808f09fb7cc03780e2af94c73
  GitTreeState: clean
  GitTag: v3.4.6
  GoVersion: go1.18.10
  Compiler: gc
  Platform: linux/amd64

Any ideas? Thanks.


Solution

  • Ok, finally got back to this and figured out the proper nomenclature. The rateLimit block needs to be entered with (or at least works with) the following syntax:

    triggers:
      - template:
          name: amqp-workflow-trigger
          k8s:
            operation: create
            source:
              ...
    
        rateLimit:
          unit: Minutes
          requestsPerUnit: 5
    

    With that, the sensor is reading event messages at the prescribed rate.