feature: Implement Event stream for Application/Instance/Service  #1472 (#1487)

* Feat: Add event timeline for application/instance/service with K8s event ingestion ([#1472](https://github.com/apache/dubbo-admin/issues/1472))

- Add K8sEvent resource type (proto + Go spec) and store indexes
- Add K8sEventListerWatcher to watch K8s /api/v1/events via client-go
- Register K8sEventListerWatcher in Kubernetes EngineFactory
- Add /application/event, /instance/event, /service/event console API endpoints
- Add EventTimeline shared Vue component with normal/warning node styles
- Wire up event tabs for application, instance, and service detail pages
- Un-hide event tab routes in frontend router
- Add mock event handlers for development
- Add PlatformEvent resource type (platformevent_types.go) with store indexes
- Add shared platform_event_recorder utility for event recording
- Record ZK config change events (tag-route, condition-route, dynamic-config)
- Record ZK metadata events (provider/consumer metadata added/updated)
- Record Nacos instance registration/deregistration events
- Record Nacos consumer metadata change events
- Merge K8s events and Platform events into unified timeline in event query service
- Downgrade "no subscriber" log level from INFO to DEBUG to reduce log noise

* Fix: Address review feedback for K8s event timeline — zero timestamps, watch spam, silent drops, delete-before-add

- K8sEventListerWatcher: check IsZero() before formatting FirstTimestamp/LastTimestamp
  to avoid emitting synthetic "0001-01-01 00:00:00" values that break timeline ordering.
- EventTimeline.vue: remove unconditional watch() that triggered cascading loadMore calls;
  rely solely on IntersectionObserver for scroll-based pagination.
- RecordRegistryEvent: log a warning when dropping events due to empty Mesh or Message
  instead of silently discarding them.
- K8sEventSubscriber.writeEvent: delete the informer-written (original-key) entry only
  after a successful Add of the timestamp-prefixed entry, preventing permanent event
  loss when Add fails.

* Refactor: Rename K8sEvent to LifecycleEvent for unified event model

K8sEvent was originally named for K8s-sourced events only, but now also
carries registry-side events (ZK/Nacos) via the EventSource discriminator.
Rename to LifecycleEvent to accurately reflect its role as a unified
lifecycle event type covering both K8s and registry origins.

- Proto: K8sEvent → LifecycleEvent
- Resource: K8sEventResource → LifecycleEventResource
- Kind: K8sEventKind → LifecycleEventKind
- Subscriber: K8sEventSubscriber → LifecycleEventSubscriber
- Index constants: ByK8sEvent* → ByLifecycleEvent*
- Files: k8s_event.* → lifecycle_event.*
- Retained: K8sEventListerWatcher (K8s-specific component)
36 files changed
tree: e2a10ce51314b46da131363e0b8b01c4029c6ab6
  1. .agents/
  2. .github/
  3. api/
  4. app/
  5. docs/
  6. pkg/
  7. release/
  8. scripts/
  9. ui-vue3/
  10. .asf.yaml
  11. .codecov.yml
  12. .gitattributes
  13. .gitignore
  14. .licenserc.yaml
  15. CHANGELOG.md
  16. CONTRIBUTING.md
  17. Dockerfile
  18. go.mod
  19. go.sum
  20. LICENSE
  21. Makefile
  22. NOTICE
  23. README.md
README.md

Build codecov license

Dubbo Admin is the console designed for better visualization of Dubbo applications.

Repositories

The main code repositories of Dubbo Admin include:

  • ui-vue3: Implements the front-end interface of Dubbo Admin.
  • Dubbo Admin Console: Implemented in the app and pkg directories.
    For more details, see the app/README.

Quick Start

Please refer to official website.

Roadmap

Please refer to RoadMap.

Contributing

Admin UI

Admin Server

Other Information

Refer to CONTRIBUTING.md

License

Apache License 2.0, see LICENSE.