implement counter by key - #1390
Conversation
ae3f8eb to
5e17b0a
Compare
There was a problem hiding this comment.
Pull request overview
This PR implements mesh-based grouping for the counter system, allowing statistics to be tracked and queried per mesh rather than only globally. The changes refactor the counter infrastructure from using atomic operations to map-based group tracking, and add initialization logic to populate counters from existing store data on startup.
Changes:
- Refactored
CounterandDistributionCounterto support group-based (mesh) counting instead of global atomic counters - Added
CountByMeshandDistributionByMeshmethods to theCounterManagerinterface for mesh-specific queries - Implemented counter initialization from the resource store on component startup to ensure accurate counts
- Updated the overview API handler to support optional mesh query parameter for filtered statistics
- Added mesh index to resource queries in discovery subscribers for improved query performance
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| pkg/console/counter/counter.go | Refactored Counter and DistributionCounter from atomic operations to map-based group tracking |
| pkg/console/counter/manager.go | Added mesh-aware counting methods and updated event processing to track resources by mesh |
| pkg/console/counter/component.go | Added initialization logic to populate counters from existing store data on startup |
| pkg/console/handler/overview.go | Added support for optional mesh query parameter in cluster overview endpoint |
| pkg/core/discovery/subscriber/nacos_service.go | Added mesh index to resource queries for improved filtering |
| pkg/core/discovery/subscriber/instance.go | Added mesh index to instance resource queries for improved filtering |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| func (cm *counterManager) CountByMesh(kind resmodel.ResourceKind, mesh string) int64 { | ||
| if mesh == "" { | ||
| mesh = "default" | ||
| } | ||
| if counter, exists := cm.simpleCounters[kind]; exists { | ||
| return counter.GetByGroup(mesh) | ||
| } | ||
| return 0 | ||
| } | ||
|
|
||
| func (cm *counterManager) DistributionByMesh(metric CounterType, mesh string) map[string]int64 { | ||
| if mesh == "" { | ||
| mesh = "default" | ||
| } | ||
| return result | ||
| counter, exists := cm.distributionByType[metric] | ||
| if !exists { | ||
| return map[string]int64{} | ||
| } | ||
| return counter.GetByGroup(mesh) |
There was a problem hiding this comment.
The new mesh-based counting functionality introduced in CountByMesh and DistributionByMesh methods lacks test coverage. Given the complexity of the grouping logic and the presence of tests elsewhere in the repository, tests should be added to verify correct behavior for single mesh, multiple meshes, and edge cases like empty mesh names.
| return fmt.Errorf("component %s does not implement store.Router", runtime.ResourceStore) | ||
| } | ||
|
|
||
| c.initializeCountsFromStore(storeRouter) |
There was a problem hiding this comment.
The error returned by initializeCountsFromStore is being ignored. If initialization fails, the counter manager will start with incorrect counts but the application will continue running. This should either return the error to fail fast, or log a warning if partial initialization is acceptable.
| c.initializeCountsFromStore(storeRouter) | |
| if err := c.initializeCountsFromStore(storeRouter); err != nil { | |
| fmt.Printf("warning: failed to initialize counter manager from store: %v\n", err) | |
| } |
| if oldKey == newKey { | ||
| return | ||
| } | ||
| oldMesh := extractMeshName(oldObj) | ||
| newMesh := extractMeshName(newObj) |
There was a problem hiding this comment.
The update method only updates counters when oldKey != newKey, but it doesn't handle the case where the mesh changes while the key stays the same. This means if a resource moves from one mesh to another without changing its protocol/release/discovery value, the counters won't be updated correctly. The condition should check if either the key or mesh has changed.
| if oldKey == newKey { | |
| return | |
| } | |
| oldMesh := extractMeshName(oldObj) | |
| newMesh := extractMeshName(newObj) | |
| oldMesh := extractMeshName(oldObj) | |
| newMesh := extractMeshName(newObj) | |
| if oldKey == newKey && oldMesh == newMesh { | |
| return | |
| } |
| for mesh, count := range meshCounts { | ||
| for i := int64(0); i < count; i++ { | ||
| counter.Increment(mesh) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| if kind == meshresource.InstanceKind { | ||
| for mesh, distributions := range meshDistributions { | ||
| for key, count := range distributions { | ||
| if len(key) > 9 && key[:9] == "protocol:" { | ||
| if cfg := cm.getDistributionConfig(kind, ProtocolCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[9:]) | ||
| } | ||
| } | ||
| } else if len(key) > 8 && key[:8] == "release:" { | ||
| if cfg := cm.getDistributionConfig(kind, ReleaseCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[8:]) | ||
| } | ||
| } | ||
| } else if len(key) > 11 && key[:11] == "discovery:" { | ||
| if cfg := cm.getDistributionConfig(kind, DiscoveryCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[11:]) |
There was a problem hiding this comment.
Using a loop to call Increment multiple times is inefficient. Consider adding a bulk increment method like IncrementBy(group string, count int64) to the Counter struct to improve performance during initialization.
| for mesh, count := range meshCounts { | |
| for i := int64(0); i < count; i++ { | |
| counter.Increment(mesh) | |
| } | |
| } | |
| } | |
| if kind == meshresource.InstanceKind { | |
| for mesh, distributions := range meshDistributions { | |
| for key, count := range distributions { | |
| if len(key) > 9 && key[:9] == "protocol:" { | |
| if cfg := cm.getDistributionConfig(kind, ProtocolCounter); cfg != nil { | |
| for i := int64(0); i < count; i++ { | |
| cfg.counter.Increment(mesh, key[9:]) | |
| } | |
| } | |
| } else if len(key) > 8 && key[:8] == "release:" { | |
| if cfg := cm.getDistributionConfig(kind, ReleaseCounter); cfg != nil { | |
| for i := int64(0); i < count; i++ { | |
| cfg.counter.Increment(mesh, key[8:]) | |
| } | |
| } | |
| } else if len(key) > 11 && key[:11] == "discovery:" { | |
| if cfg := cm.getDistributionConfig(kind, DiscoveryCounter); cfg != nil { | |
| for i := int64(0); i < count; i++ { | |
| cfg.counter.Increment(mesh, key[11:]) | |
| // Use bulk increment when supported by the underlying counter implementation. | |
| type bulkCounter interface { | |
| IncrementBy(group string, count int64) | |
| } | |
| if bc, ok := counter.(bulkCounter); ok { | |
| for mesh, count := range meshCounts { | |
| bc.IncrementBy(mesh, count) | |
| } | |
| } else { | |
| for mesh, count := range meshCounts { | |
| for i := int64(0); i < count; i++ { | |
| counter.Increment(mesh) | |
| } | |
| } | |
| } | |
| } | |
| if kind == meshresource.InstanceKind { | |
| // Use bulk increment when supported by the underlying distribution counter implementation. | |
| type distBulkCounter interface { | |
| IncrementBy(mesh, label string, count int64) | |
| } | |
| for mesh, distributions := range meshDistributions { | |
| for key, count := range distributions { | |
| if len(key) > 9 && key[:9] == "protocol:" { | |
| if cfg := cm.getDistributionConfig(kind, ProtocolCounter); cfg != nil { | |
| if bc, ok := cfg.counter.(distBulkCounter); ok { | |
| bc.IncrementBy(mesh, key[9:], count) | |
| } else { | |
| for i := int64(0); i < count; i++ { | |
| cfg.counter.Increment(mesh, key[9:]) | |
| } | |
| } | |
| } | |
| } else if len(key) > 8 && key[:8] == "release:" { | |
| if cfg := cm.getDistributionConfig(kind, ReleaseCounter); cfg != nil { | |
| if bc, ok := cfg.counter.(distBulkCounter); ok { | |
| bc.IncrementBy(mesh, key[8:], count) | |
| } else { | |
| for i := int64(0); i < count; i++ { | |
| cfg.counter.Increment(mesh, key[8:]) | |
| } | |
| } | |
| } | |
| } else if len(key) > 11 && key[:11] == "discovery:" { | |
| if cfg := cm.getDistributionConfig(kind, DiscoveryCounter); cfg != nil { | |
| if bc, ok := cfg.counter.(distBulkCounter); ok { | |
| bc.IncrementBy(mesh, key[11:], count) | |
| } else { | |
| for i := int64(0); i < count; i++ { | |
| cfg.counter.Increment(mesh, key[11:]) | |
| } |
| if len(key) > 9 && key[:9] == "protocol:" { | ||
| if cfg := cm.getDistributionConfig(kind, ProtocolCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[9:]) | ||
| } | ||
| } | ||
| } else if len(key) > 8 && key[:8] == "release:" { | ||
| if cfg := cm.getDistributionConfig(kind, ReleaseCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[8:]) | ||
| } | ||
| } | ||
| } else if len(key) > 11 && key[:11] == "discovery:" { | ||
| if cfg := cm.getDistributionConfig(kind, DiscoveryCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[11:]) | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Using magic numbers for string prefix lengths (9, 8, 11) makes the code fragile and error-prone. Consider using constants or the strings.HasPrefix function with explicit prefix strings to make the code more maintainable and less prone to errors if the prefixes change.
| func (c *Counter) Increment(group string) { | ||
| if group == "" { | ||
| group = "default" | ||
| } | ||
| c.mu.Lock() | ||
| defer c.mu.Unlock() | ||
| c.data[group]++ | ||
| } | ||
|
|
||
| func (c *Counter) Decrement(group string) { | ||
| if group == "" { | ||
| group = "default" | ||
| } | ||
| c.mu.Lock() | ||
| defer c.mu.Unlock() | ||
| if value, ok := c.data[group]; ok { | ||
| value-- | ||
| if value <= 0 { | ||
| delete(c.data, group) | ||
| } else { | ||
| c.data[group] = value | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
The Counter and DistributionCounter refactoring from atomic operations to map-based group tracking introduces significant complexity but lacks test coverage. Tests should verify thread safety, correct increment/decrement behavior per group, proper cleanup when counts reach zero, and the GetByGroup functionality.
| func (c *managerComponent) initializeCountsFromStore(storeRouter store.Router) error { | ||
| if err := c.initializeResourceCount(storeRouter, meshresource.InstanceKind); err != nil { | ||
| return fmt.Errorf("failed to initialize instance count: %w", err) | ||
| } | ||
|
|
||
| if err := c.initializeResourceCount(storeRouter, meshresource.ApplicationKind); err != nil { | ||
| return fmt.Errorf("failed to initialize application count: %w", err) | ||
| } | ||
|
|
||
| if err := c.initializeResourceCount(storeRouter, meshresource.ServiceProviderMetadataKind); err != nil { | ||
| return fmt.Errorf("failed to initialize service provider metadata count: %w", err) | ||
| } | ||
|
|
||
| return nil | ||
| } | ||
|
|
||
| func (c *managerComponent) initializeResourceCount(storeRouter store.Router, kind resmodel.ResourceKind) error { | ||
| resourceStore, err := storeRouter.ResourceKindRoute(kind) | ||
| if err != nil { | ||
| return err | ||
| } | ||
|
|
||
| allResources := resourceStore.List() | ||
|
|
||
| meshCounts := make(map[string]int64) | ||
| meshDistributions := make(map[string]map[string]int64) | ||
|
|
||
| for _, obj := range allResources { | ||
| resource, ok := obj.(resmodel.Resource) | ||
| if !ok { | ||
| continue | ||
| } | ||
|
|
||
| mesh := resource.ResourceMesh() | ||
| if mesh == "" { | ||
| mesh = "default" | ||
| } | ||
|
|
||
| meshCounts[mesh]++ | ||
|
|
||
| if kind == meshresource.InstanceKind { | ||
| instance, ok := resource.(*meshresource.InstanceResource) | ||
| if ok && instance.Spec != nil { | ||
| protocol := instance.Spec.GetProtocol() | ||
| if protocol != "" { | ||
| if meshDistributions[mesh] == nil { | ||
| meshDistributions[mesh] = make(map[string]int64) | ||
| } | ||
| meshDistributions[mesh]["protocol:"+protocol]++ | ||
| } | ||
|
|
||
| releaseVersion := instance.Spec.GetReleaseVersion() | ||
| if releaseVersion != "" { | ||
| if meshDistributions[mesh] == nil { | ||
| meshDistributions[mesh] = make(map[string]int64) | ||
| } | ||
| meshDistributions[mesh]["release:"+releaseVersion]++ | ||
| } | ||
|
|
||
| if meshDistributions[mesh] == nil { | ||
| meshDistributions[mesh] = make(map[string]int64) | ||
| } | ||
| meshDistributions[mesh]["discovery:"+mesh]++ | ||
| } | ||
| } | ||
| } | ||
|
|
||
| cm := c.manager.(*counterManager) | ||
|
|
||
| if counter, exists := cm.simpleCounters[kind]; exists { | ||
| for mesh, count := range meshCounts { | ||
| for i := int64(0); i < count; i++ { | ||
| counter.Increment(mesh) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| if kind == meshresource.InstanceKind { | ||
| for mesh, distributions := range meshDistributions { | ||
| for key, count := range distributions { | ||
| if len(key) > 9 && key[:9] == "protocol:" { | ||
| if cfg := cm.getDistributionConfig(kind, ProtocolCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[9:]) | ||
| } | ||
| } | ||
| } else if len(key) > 8 && key[:8] == "release:" { | ||
| if cfg := cm.getDistributionConfig(kind, ReleaseCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[8:]) | ||
| } | ||
| } | ||
| } else if len(key) > 11 && key[:11] == "discovery:" { | ||
| if cfg := cm.getDistributionConfig(kind, DiscoveryCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[11:]) | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| return nil | ||
| } |
There was a problem hiding this comment.
The initializeCountsFromStore function, which is critical for ensuring correct counter initialization on startup, lacks test coverage. Tests should verify correct initialization from existing store data, proper handling of resources across multiple meshes, and correct distribution counter initialization for instances.
| if len(key) > 9 && key[:9] == "protocol:" { | ||
| if cfg := cm.getDistributionConfig(kind, ProtocolCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[9:]) | ||
| } | ||
| } | ||
| } else if len(key) > 8 && key[:8] == "release:" { | ||
| if cfg := cm.getDistributionConfig(kind, ReleaseCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[8:]) | ||
| } | ||
| } | ||
| } else if len(key) > 11 && key[:11] == "discovery:" { | ||
| if cfg := cm.getDistributionConfig(kind, DiscoveryCounter); cfg != nil { | ||
| for i := int64(0); i < count; i++ { | ||
| cfg.counter.Increment(mesh, key[11:]) | ||
| } | ||
| } |
There was a problem hiding this comment.
Using loops to call Increment multiple times is inefficient. Consider adding a bulk increment method to the DistributionCounter struct to improve performance during initialization, especially when dealing with large numbers of resources.
| protocol := instance.Spec.GetProtocol() | ||
| if protocol != "" { | ||
| if meshDistributions[mesh] == nil { | ||
| meshDistributions[mesh] = make(map[string]int64) | ||
| } | ||
| meshDistributions[mesh]["protocol:"+protocol]++ | ||
| } | ||
|
|
||
| releaseVersion := instance.Spec.GetReleaseVersion() | ||
| if releaseVersion != "" { | ||
| if meshDistributions[mesh] == nil { | ||
| meshDistributions[mesh] = make(map[string]int64) | ||
| } | ||
| meshDistributions[mesh]["release:"+releaseVersion]++ | ||
| } | ||
|
|
||
| if meshDistributions[mesh] == nil { | ||
| meshDistributions[mesh] = make(map[string]int64) | ||
| } |
There was a problem hiding this comment.
The code repeatedly checks and initializes meshDistributions[mesh] on lines 137, 145, and 151. This logic should be refactored to initialize the map once at the beginning of the instance processing block to improve code clarity and avoid redundant checks.
| protocol := instance.Spec.GetProtocol() | |
| if protocol != "" { | |
| if meshDistributions[mesh] == nil { | |
| meshDistributions[mesh] = make(map[string]int64) | |
| } | |
| meshDistributions[mesh]["protocol:"+protocol]++ | |
| } | |
| releaseVersion := instance.Spec.GetReleaseVersion() | |
| if releaseVersion != "" { | |
| if meshDistributions[mesh] == nil { | |
| meshDistributions[mesh] = make(map[string]int64) | |
| } | |
| meshDistributions[mesh]["release:"+releaseVersion]++ | |
| } | |
| if meshDistributions[mesh] == nil { | |
| meshDistributions[mesh] = make(map[string]int64) | |
| } | |
| if meshDistributions[mesh] == nil { | |
| meshDistributions[mesh] = make(map[string]int64) | |
| } | |
| protocol := instance.Spec.GetProtocol() | |
| if protocol != "" { | |
| meshDistributions[mesh]["protocol:"+protocol]++ | |
| } | |
| releaseVersion := instance.Spec.GetReleaseVersion() | |
| if releaseVersion != "" { | |
| meshDistributions[mesh]["release:"+releaseVersion]++ | |
| } |
robocanic
left a comment
There was a problem hiding this comment.
Great Work! I've left some comments, if you have any problems, discuss it with me.
| if kind == meshresource.InstanceKind { | ||
| for mesh, distributions := range meshDistributions { | ||
| for key, count := range distributions { | ||
| if len(key) > 9 && key[:9] == "protocol:" { |
There was a problem hiding this comment.
Suggestion:这里的逻辑是不是能直接放到上面的for-loop里面,将对应的子类型increment,不需要再来一个map中转
9efa888 to
17329aa
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.
Comments suppressed due to low confidence (1)
pkg/console/counter/counter.go:168
- The newly added GetByGroup method lacks documentation. Public methods should have comments describing their purpose, parameters, and return values.
func (c *DistributionCounter) GetByGroup(group string) map[string]int64 {
if group == "" {
group = "default"
}
c.mu.RLock()
defer c.mu.RUnlock()
groupData, exists := c.data[group]
if !exists {
return map[string]int64{}
}
result := make(map[string]int64, len(groupData))
for k, v := range groupData {
result[k] = v
}
return result
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| counter.Decrement() | ||
| counter.Decrement(mesh) | ||
| logger.Debugf("CounterManager: Decrement %s for mesh=%s, current count=%d", counter.name, mesh, counter.GetByGroup(mesh)) | ||
| case cache.Updated: |
There was a problem hiding this comment.
Simple counters do not handle mesh changes during update events. If a resource's mesh changes from "meshA" to "meshB" during an update, the counter for "meshA" should decrement and "meshB" should increment, but currently the update case is a no-op. This can lead to incorrect counts when resources move between meshes.
| case cache.Updated: | |
| case cache.Updated: | |
| oldMesh := extractMeshName(event.OldObj()) | |
| newMesh := extractMeshName(event.NewObj()) | |
| if oldMesh != newMesh { | |
| counter.Decrement(oldMesh) | |
| logger.Debugf("CounterManager: Decrement %s for mesh=%s (Updated), current count=%d", counter.name, oldMesh, counter.GetByGroup(oldMesh)) | |
| counter.Increment(newMesh) | |
| logger.Debugf("CounterManager: Increment %s for mesh=%s (Updated), current count=%d", counter.name, newMesh, counter.GetByGroup(newMesh)) | |
| } |
| Distribution(metric CounterType) map[string]int64 | ||
| CountByMesh(kind resmodel.ResourceKind, mesh string) int64 |
There was a problem hiding this comment.
The newly added CountByMesh and DistributionByMesh methods lack documentation comments. Public interface methods should have comments describing their purpose, parameters, and return values to help API consumers understand how to use them.
| Distribution(metric CounterType) map[string]int64 | |
| CountByMesh(kind resmodel.ResourceKind, mesh string) int64 | |
| Distribution(metric CounterType) map[string]int64 | |
| // CountByMesh returns the number of resources of the given kind that belong to the specified mesh. | |
| // The mesh parameter identifies the mesh to filter on. | |
| CountByMesh(kind resmodel.ResourceKind, mesh string) int64 | |
| // DistributionByMesh returns a distribution of counts for the given metric limited to the specified mesh. | |
| // The returned map keys are metric values (for example, protocol or release) and the values are their counts. |
| func (c *Counter) GetByGroup(group string) int64 { | ||
| if group == "" { | ||
| group = "default" | ||
| } | ||
| c.mu.RLock() | ||
| defer c.mu.RUnlock() | ||
| return c.data[group] | ||
| } |
There was a problem hiding this comment.
The newly added GetByGroup method lacks documentation. Public methods should have comments describing their purpose, parameters, and return values.
robocanic
left a comment
There was a problem hiding this comment.
LGTM. Please merge the develop branch and I will merge into it.
|
ok |
* Fix: Address the admin issues before the release (#1391) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: add Apache License headers to YAML files in release/kubernetes (#1393) * feat: enhance UI components, improve error handling, and add routing rule management (#1394) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: improve error handling and UI updates in GrafanaPage and sceneConfig components - Added conditional checks in GrafanaPage.vue to ensure valid baseURL before constructing the Grafana URL. - Enhanced iframe loading logic to prevent errors when accessing undefined elements. - Updated service.vue to handle potential undefined values in versionGroups, ensuring robust data handling. - Refactored sceneConfig.vue to improve the user experience by adding a conditional rendering for parameter routes, including a message for empty configurations and a button for adding new routes. * refactor: Request to update the Grafana URL * build: build * ♻️ refactor: update route parameters to include name and make pathId/appName optional Update routing structure across instance and traffic management views to: - Add :name parameter to routes for better identification - Make :pathId and :appName optional parameters (with ?) - Affects instance detail, monitor, link tracking, and configuration tabs - Updates dynamic config, routing rule, and tag rule views accordingly This change provides more flexible routing and better resource identification. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * ✨ feat(routing): add routing rule list component and composable Add new RoutingRuleList component and useRoutingRule composable to manage routing rule configurations. Updates addByFormView and updateByFormView to integrate with the new components. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * build: format & build * ✨ feat(routing): enhance routing rule form with comprehensive i18n support Enhance routing rule form functionality with improved internationalization, user interface refinements, and better form handling. - Add comprehensive i18n translations for routing rule fields - Improve form layout and field descriptions - Enhance routing rule list component with better UX - Refactor routing rule composable for better maintainability - Update tab header slots for improved navigation Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * build: format & build --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> * Fix/console (#1397) * fix: create tag rule bug * refactor: config refactor; fix: fix console bugs * fix: instance disable traffic * fix: CI promblems * fix: typo * fix(ui): update footer copyright year to 2026 (#1396) * implement counter by key (#1390) * implement counter by key * chore: trigger CI * Fix counter initialization errors and mesh change detection logic --------- Co-authored-by: WyRainBow <your-email@example.com> * feat: kubernetes deployment manifests and docker file (#1410) * refactor: refactor dockerfile and implement dubbo-admin deployment * fix: deploy manifests --------- Co-authored-by: LGgbond <1493170339@qq.com> Co-authored-by: WyRainBow <weiyu9484@gmail.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: Akshit Vig <akshitvig48@gmail.com> Co-authored-by: WyRainBow <your-email@example.com>
* feat: informer general framework and engine/discovery interface definition (#1314) * feat: informer general framework and engine/discovery interface definition * fix: ci problem; directory and dependency tidy (#1320) * fix: ci probelm; diretory and dependency tidy * fix: lack license header * rm: remove redundant file * ci(makefile): add makefile for ci (#1322) * ci(makefile): add makefile for ci * style(ci): rename dubbo-admin ci * delete unused ci (#1326) * fix: refractor web handler and service to fix compile error; (#1325) * fix: refractor web handler and service to fix compile error; * feat: support memory type of store (#1332) * feat: support memory type of store * fix: muilti indexes should use intersecection * simplify code Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * refractor: GetByKeys return a list instead of map --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: support kubernetes as a backend engine (#1340) * feat: implement runtime engine using kubernetes * feat: Defined a unified error (#1353) * feat: unified error code; separate application handler and service into parts * fix: license header lack * fix: copilot review err fix * fix: simplify the if-else condition * chore: rename Error() to String() * chore: add extra String() in Error * feat: 新增listMeshes接口 * fix: copilot review * Implment Counter in local cache (#1345) * fix: update response interceptor to handle success and error messages more accurately (#1355) * feat(UI): Support multiple registries (#1356) * feat(#1352): Support multiple registries: add registry select box and refresh main area on change * doc(build): build ui * fix(#1352): Set first available mesh after login when no mesh is set * doc(build): build ui * fix(conflict) * doc(build): build ui * feat: implement mysql and postgresql store for resources (#1360) * feat: implement mysql and postgresql store for resources * fix some issues * ut: add some test cases * fix: dynamic table name * feat: implements discovery backend by nacos (#1367) * feat: support nacos2 to do discovery * refractor: abstract nacos and nacos service * fix: unit test and license header * fix: copilot review problem * chore: remove redundant code * fix counter bug (#1369) * fix: add indexer before init cause npe (#1372) * fix: add indexer before init cause npe * fix: unit test * Fix: Redirect to login page when receiving 401 unauthorized response from API (#1373) * feat: enhance error handling for unauthorized access and improve toast messages * feat: enhance error handling for unauthorized access and improve toast messages * fix: correct syntax error in response interceptor for redirect handling * Update ui-vue3/src/base/http/request.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: add YAML and XML editor components, update index references, and enhance error logging - Introduced new JavaScript files for YAML and XML syntax highlighting and editing capabilities. - Added a new component for updating YAML configurations with a structured editor interface. - Updated the index.html to reference the new JavaScript bundle for improved functionality. - Enhanced the HTTP request module to log errors during redirection on 401 responses for better debugging. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: implement discovery backend by zk (#1371) * feat: implements discovery backend by zk * feat: support components to start in dependency order (#1370) * feat: support components to start in dependency order * imporve * fix * fix error import * release changelog (#1376) * changelog * chore: rename refactor to enhancements * refactor: 🎨 Optimize UI styles and search functionality (#1379) * feat: enhance error handling for unauthorized access and improve toast messages * feat: enhance error handling for unauthorized access and improve toast messages * fix: correct syntax error in response interceptor for redirect handling * Update ui-vue3/src/base/http/request.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: add YAML and XML editor components, update index references, and enhance error logging - Introduced new JavaScript files for YAML and XML syntax highlighting and editing capabilities. - Added a new component for updating YAML configurations with a structured editor interface. - Updated the index.html to reference the new JavaScript bundle for improved functionality. - Enhanced the HTTP request module to log errors during redirection on 401 responses for better debugging. * docs: Only supports exact matching; remove the "prefix search" function from the placeholder (background word) * docs: All sorting indicators for lists are initially hidden, including but not limited to the list pages for applications, instances, services, and traffic management * refactor: 🎨 Optimize the styles of some tables and adapt to backend changes * docs: api baseurl --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(ui): Enhance service metrics display and optimize table UI styles (#1383) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components (#1385) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: fix console bugs and makes console functions effective (#1378) * fix: console interfaces;feat: implements governor using zk and nacos * fix: instance subscriber * fix: unit-test * fix: rules search * resolve conflicts * fix: backend bugs * fix: rule handler and service refactor * fix: config error andd field mapping * fix: rename msg to message * fix: wrap prometheus error * fix ci * feat: add deploy manifests and fix metric and trace dashboard bugs (#1387) * feat: add monitoring/dubbo-samples-shop/dubbo-system resources * fix: metric, trace dashboard bug * Fix: Address the admin issues before the release (#1391) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: add Apache License headers to YAML files in release/kubernetes (#1393) * feat: enhance UI components, improve error handling, and add routing rule management (#1394) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: improve error handling and UI updates in GrafanaPage and sceneConfig components - Added conditional checks in GrafanaPage.vue to ensure valid baseURL before constructing the Grafana URL. - Enhanced iframe loading logic to prevent errors when accessing undefined elements. - Updated service.vue to handle potential undefined values in versionGroups, ensuring robust data handling. - Refactored sceneConfig.vue to improve the user experience by adding a conditional rendering for parameter routes, including a message for empty configurations and a button for adding new routes. * refactor: Request to update the Grafana URL * build: build * ♻️ refactor: update route parameters to include name and make pathId/appName optional Update routing structure across instance and traffic management views to: - Add :name parameter to routes for better identification - Make :pathId and :appName optional parameters (with ?) - Affects instance detail, monitor, link tracking, and configuration tabs - Updates dynamic config, routing rule, and tag rule views accordingly This change provides more flexible routing and better resource identification. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * ✨ feat(routing): add routing rule list component and composable Add new RoutingRuleList component and useRoutingRule composable to manage routing rule configurations. Updates addByFormView and updateByFormView to integrate with the new components. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * build: format & build * ✨ feat(routing): enhance routing rule form with comprehensive i18n support Enhance routing rule form functionality with improved internationalization, user interface refinements, and better form handling. - Add comprehensive i18n translations for routing rule fields - Improve form layout and field descriptions - Enhance routing rule list component with better UX - Refactor routing rule composable for better maintainability - Update tab header slots for improved navigation Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * build: format & build --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> * Fix/console (#1397) * fix: create tag rule bug * refactor: config refactor; fix: fix console bugs * fix: instance disable traffic * fix: CI promblems * fix: typo * fix(ui): update footer copyright year to 2026 (#1396) * implement counter by key (#1390) * implement counter by key * chore: trigger CI * Fix counter initialization errors and mesh change detection logic --------- Co-authored-by: WyRainBow <your-email@example.com> * feat: kubernetes deployment manifests and docker file (#1410) * refactor: refactor dockerfile and implement dubbo-admin deployment * fix: deploy manifests * rm: remove useless files (#1416) * feat: implement distributed lock by gorm (#1432) * feat: add leader election for Discovery, Engine, Counter.(#1423) * feat: add leader election for Discovery and Engine components * fix: separate renew/acquire SQL and stop informers on demotion * feat: add leader election for Counter component * fix: resolve copilot review suggestion * fix: GormStore.Pool return value * Feat: Enhance service method retrieval and invocation features (#1429) * feat: add endpoint to retrieve service method names and corresponding request model * feat: add endpoint and logic to retrieve service method details * feat: trim whitespace from service name, mesh, group, version, and provider app name in ServiceMethodsReq * feat: enhance service method handling with overload support and signature retrieval * feat: add generic service invocation support * feat: refactor triple RPC instance selection to use a dedicated target struct * feat: remove obsolete service methods test file * feat: improve error handling in generic service invocation and add parameter count validation * feat: remove unnecessary variable and directly call service.InvokeServiceGeneric in ServiceGenericInvoke * feat: improve query validation by using strutil for blank checks and enhance service provider metadata indexing * feat: add endpoint to retrieve service provider instances and enhance request validation * feat: update service provider instance handling and improve request validation * feat: enhance generic service invocation with protocol and serialization support * feat: add normalization functions for JSON values in generic service invocation * feat: add normalization functions for JSON values in generic service invocation * feat: refine retry logic for service invocation failures * feat(ui-vue3): 添加 mock 数据支持,优化请求配置 - 添加环境变量 `VITE_MOCK_ENABLED` 用于启用 mock 数据模式 - 更新 `package.json` 脚本以添加 `dev:mock` 用于 mock 数据开发环境 - 新增 `mockLogin.ts` 文件,提供 mock 登录和登出接口 - 修改 `request.ts`,根据环境变量切换请求的 `baseURL` - 优化 `main.ts`,根据 mock 模式自动导入 mock API 并更新认证状态 * feat(ui-vue3): 新增 Axios 依赖和 mock 数据接口 - 新增 axios 作为 HTTP 客户端依赖 - 优化 mock 数据接口,包括应用指标、流量权重、灰度配置等 - 更新 package.json 文件以添加 axios 依赖 - 修改多个 mock 接口以适应新的架构和数据结构 * feat(api): 新增 mock 服务方法列表、详情及泛化调用接口 * feat(api): add front func * feat(ui-vue3): improve func empty description * feat(ui-vue3): code format * feat(api): update mock interface * feat(ui-vue3): add elapsed time display for service debug invoke * refactor: replace mockjs with MSW for API mocking Migrate from mockjs to Mock Service Worker (MSW) for a more realistic mock setup that intercepts at the network level. This eliminates the need for a separate mock baseURL and simplifies the mock architecture. - Remove mockjs dependency and all src/api/mock/* files - Add msw with browser worker and handler-based mock definitions - Move mock data to src/mocks/ with per-domain handler organization - Add shared API type definitions in src/types/api.ts - Simplify request.ts baseURL (always /api/v1, MSW handles interception) - Update main.ts mock initialization to use MSW worker * feat(api): refactor service request handling to use BaseServiceReq * feat(api): simplify service provider metadata lookup logic * feat(api): streamline service method resolution and metadata handling * feat(api): enhance ServiceGenericInvokeReq structure and streamline metadata handling * style(debug): format icon imports for improved readability * refactor(api): simplify splitGenericArrayType function by removing redundant checks * chore(deps): downgrade msw and related dependencies to version 2.11.6 * style(debug): improve debug tab UI with typography components and refined styles * style(debug): refine button and typography styles for improved consistency --------- Co-authored-by: 劳资蜀道山 <1493170339@qq.com> * feat: extend indexer with prefix matching and db persistence (#1422) * feat: extend indexer with prefix matching and db persistence * refactor: remove in-memory index from GormStore and add operator field * fix: copilot review suggestion and service panic * update * feat: unify and enhance the lifecycle of an instance (#1440) * feat: add lifecycle state management and color coding for instance statuses * feat: enhance instance lifecycle management with state derivation and UI updates * feat: improve resource handling in informer with enhanced error reporting * feat: enhance instance lifecycle logging with detailed merge and delete events * feat: implement ResourceKeyProvider interface for consistent key generation in informers * refactor: refactor instance resource handling and key function resolution in informers * refactor: remove unused deployState and registerState columns from instance table * feat: enhance runtime instance retrieval with improved matching logic and fallback handling * feat: improve runtime instance identification with enhanced error logging and filtering * feat: add pod watch selector and RPC port identifiers for improved service configuration * feat: add refresh button and localization support for improved user interaction * fix: fix lint * feat: enhance runtime instance retrieval with improved fallback handling and logging for ambiguous matches * fix: enhance instance lifecycle and deployment state management with new types and improved data handling * feat(eventbus): support per-subscriber async dispatch with graceful drain (#1455) * feat(eventbus): support per-subscriber async dispatch with graceful drain * refactor(config): unify AdminConfig method receivers as pointers * refactor(eventbus): move AsyncEnabled into Subscriber with docs * fix(config): keep read-only helpers on value receiver * refactor(config): unify AdminConfig receiver style * feat(mcp): add Model Context Protocol (MCP) server with HTTP transport and authentication ## Summary Implement Model Context Protocol (MCP) server for Dubbo Admin to enable AI integration through standardized tool interfaces. ## Key Features - **Modular Architecture**: Core components (server, registry, tools, transport, types) - **Comprehensive Tool Support**: 11 tools covering cluster info, service discovery, instance management, metrics, and application details - **Dual Transport Support**: - Stdio transport for local Claude Desktop integration - HTTP transport for remote connections with JSON-RPC 2.0 - **Security**: Optional Bearer Token authentication for HTTP endpoint ## Configuration ## Test plan - [x] Unit tests for core components - [x] Integration tests - [x] Manual testing with Claude Desktop Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Service/Application Dependency Graph Implement (#1460) * feat(ui): Added application and service topology mapping feature * style(ui-vue3): Add a minimum width to the login form and remove unnecessary blank lines * Feat: Add service and application topology graph APIs based on discussion #1398 * feat(api): add GraphServices endpoint for service-level topology Based on discussion #1398, use ServiceProviderMetadata and ServiceConsumerMetadata to return provider/consumer application relations as graph nodes and edges for AntV G6. * feat(api): add GraphApplications endpoint for application-level topology Traverse provider/consumer service relations to build application-level graph. Also add idx_service_consumer_service_key index to support efficient serviceKey queries. * feat(api): add graph models (GraphNode, GraphEdge, GraphData) in pkg/console/model/graph.go * feat(api): add ApplicationGraphReq, ServiceGraphReq and GetApplicationGraph, GetServiceGraph handlers * feat(router): register /application/graph and /service/graph routes * feat(api): fix error handling to use direct err pass-through instead of MeshNotFoundError * Feat: Enhance service metadata derivation and detail retrieval ([#1430](#1430)) * feat(api): replace Service.{providers,consumers,features} with {methods} field Simplify Service proto by removing providers, consumers, and features map, keeping only the aggregated methods list derived from provider metadata. * feat(api): derive Service resource from ServiceProviderMetadata on add/update/delete ServiceProviderMetadataEventSubscriber now maintains Service resources by aggregating methods from all provider instances sharing the same serviceKey. Handles add, update, and delete events to keep Service spec in sync. * feat(api): add language detection from provider metadata parameters Detect provider language (golang/java) from metadata parameters and method type signatures when explicit language field is absent. * feat(api): add GetServiceDetail endpoint returning language and methods Add GET /service/detail returning ServiceDetailResp with language and aggregated method names from the derived Service resource. * feat(api): add BuildServiceIdentityKey helper for {service}:{version}:{group} * feat(api): add ByServiceName index for ServiceKind * feat(api): refactor SearchServices to query ServiceResource directly SearchServices and SearchServicesByKeywords now use ServiceResource instead of ServiceProviderMetadataResource for service listing. * feat(api): remove providerAppName from ServiceSearchResp and ServiceTabDistributionReq * feat(api): add ServiceDetailReq and ServiceDetailResp models * feat(router): register /service/detail and /service/interfaces routes * feat(ui-vue3): remove providerAppName from grafana types and tab components * chore: Add G6 chart library and its dependencies to the project * chore(assets): Add Apache license and format code for iconfont file * fix: Correct the naming errors in the application topology graph API parameters and improve the code comments * chore: minor cleanup - fix comment language and import order * chore: translate Chinese comment to English in GraphApplications error handling * chore: reorder imports in service_provider_metadata.go * fix:Fix parameter passing error when obtaining application details * fix: fix type mismatch and index issues in service search and metadata sync 1. pkg/console/service/service.go:132 - fix generic type mismatch with resourceKind - generic ServiceResource should use ServiceKind, was incorrectly passing ServiceProviderMetadataKind - index changed from ByServiceProviderServiceName to ByServiceName (aligned with ServiceKind) 2. pkg/core/discovery/subscriber/service_provider_metadata.go - processUpdate: remove redundant oldRes key check (oldKey always equals newKey in same resource update, else branch is unreachable dead code) - syncService: use ByServiceProviderServiceKey index instead of ByServiceProviderServiceName + manual version/group filtering, reduces data returned from DB and improves performance Ref: [1460](#1460 (comment)) * Feat: Add coding agent domain skills ([#1457](#1457)) * feat(skills): add backend domain skills for runtime, discovery, engine, events, store, and Console API Document component lifecycle, ListAndWatch discovery, resource engine behavior, EventBus dispatching, storage indexes, and Web MVC flow for coding agents. * feat(skills): add frontend domain skill for routing, components, and traffic rule forms Document Vue frontend structure, API clients, Pinia state, route metadata, layout tabs, and traffic rule form design. * feat(skills): add OpenAI skill metadata Add agents/openai.yaml metadata for each dubbo-admin domain skill. * fix(console): use ServiceKind for service list search Query ServiceResource from ServiceKind instead of ServiceProviderMetadataKind so the non-keyword service list path uses the matching resource store and index set. --------- Co-authored-by: sohandsomejie <3080955413@qq.com> Co-authored-by: MoChengqian <2972013548@qq.com> --------- Co-authored-by: robb <robocanic@gmail.com> Co-authored-by: marsevilspirit <marsevilspirit@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: WyRainBow <weiyu9484@gmail.com> Co-authored-by: LGgbond <1493170339@qq.com> Co-authored-by: Helltab <939255879@qq.com> Co-authored-by: Tew <finntew@outlook.com> Co-authored-by: EVERFID <166227111+everfid-ever@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: Akshit Vig <akshitvig48@gmail.com> Co-authored-by: WyRainBow <your-email@example.com> Co-authored-by: EVERFID <3085640487@qq.com> Co-authored-by: ThunGuo <tew@apache.org> Co-authored-by: Zerui Yang <zeruiyoung@gmail.com> Co-authored-by: LunaRain_079 <2074730050@qq.com> Co-authored-by: Comrade Yi <119987662+ambiguous-pointer@users.noreply.github.com> Co-authored-by: sohandsomejie <3080955413@qq.com> Co-authored-by: MoChengqian <2972013548@qq.com>
* feat: informer general framework and engine/discovery interface definition (#1314) * feat: informer general framework and engine/discovery interface definition * fix: ci problem; directory and dependency tidy (#1320) * fix: ci probelm; diretory and dependency tidy * fix: lack license header * rm: remove redundant file * ci(makefile): add makefile for ci (#1322) * ci(makefile): add makefile for ci * style(ci): rename dubbo-admin ci * delete unused ci (#1326) * fix: refractor web handler and service to fix compile error; (#1325) * fix: refractor web handler and service to fix compile error; * feat: support memory type of store (#1332) * feat: support memory type of store * fix: muilti indexes should use intersecection * simplify code Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * refractor: GetByKeys return a list instead of map --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: support kubernetes as a backend engine (#1340) * feat: implement runtime engine using kubernetes * feat: Defined a unified error (#1353) * feat: unified error code; separate application handler and service into parts * fix: license header lack * fix: copilot review err fix * fix: simplify the if-else condition * chore: rename Error() to String() * chore: add extra String() in Error * feat: 新增listMeshes接口 * fix: copilot review * Implment Counter in local cache (#1345) * fix: update response interceptor to handle success and error messages more accurately (#1355) * feat(UI): Support multiple registries (#1356) * feat(#1352): Support multiple registries: add registry select box and refresh main area on change * doc(build): build ui * fix(#1352): Set first available mesh after login when no mesh is set * doc(build): build ui * fix(conflict) * doc(build): build ui * feat: implement mysql and postgresql store for resources (#1360) * feat: implement mysql and postgresql store for resources * fix some issues * ut: add some test cases * fix: dynamic table name * feat: implements discovery backend by nacos (#1367) * feat: support nacos2 to do discovery * refractor: abstract nacos and nacos service * fix: unit test and license header * fix: copilot review problem * chore: remove redundant code * fix counter bug (#1369) * fix: add indexer before init cause npe (#1372) * fix: add indexer before init cause npe * fix: unit test * Fix: Redirect to login page when receiving 401 unauthorized response from API (#1373) * feat: enhance error handling for unauthorized access and improve toast messages * feat: enhance error handling for unauthorized access and improve toast messages * fix: correct syntax error in response interceptor for redirect handling * Update ui-vue3/src/base/http/request.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: add YAML and XML editor components, update index references, and enhance error logging - Introduced new JavaScript files for YAML and XML syntax highlighting and editing capabilities. - Added a new component for updating YAML configurations with a structured editor interface. - Updated the index.html to reference the new JavaScript bundle for improved functionality. - Enhanced the HTTP request module to log errors during redirection on 401 responses for better debugging. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: implement discovery backend by zk (#1371) * feat: implements discovery backend by zk * feat: support components to start in dependency order (#1370) * feat: support components to start in dependency order * imporve * fix * fix error import * release changelog (#1376) * changelog * chore: rename refactor to enhancements * refactor: 🎨 Optimize UI styles and search functionality (#1379) * feat: enhance error handling for unauthorized access and improve toast messages * feat: enhance error handling for unauthorized access and improve toast messages * fix: correct syntax error in response interceptor for redirect handling * Update ui-vue3/src/base/http/request.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: add YAML and XML editor components, update index references, and enhance error logging - Introduced new JavaScript files for YAML and XML syntax highlighting and editing capabilities. - Added a new component for updating YAML configurations with a structured editor interface. - Updated the index.html to reference the new JavaScript bundle for improved functionality. - Enhanced the HTTP request module to log errors during redirection on 401 responses for better debugging. * docs: Only supports exact matching; remove the "prefix search" function from the placeholder (background word) * docs: All sorting indicators for lists are initially hidden, including but not limited to the list pages for applications, instances, services, and traffic management * refactor: 🎨 Optimize the styles of some tables and adapt to backend changes * docs: api baseurl --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(ui): Enhance service metrics display and optimize table UI styles (#1383) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components (#1385) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: fix console bugs and makes console functions effective (#1378) * fix: console interfaces;feat: implements governor using zk and nacos * fix: instance subscriber * fix: unit-test * fix: rules search * resolve conflicts * fix: backend bugs * fix: rule handler and service refactor * fix: config error andd field mapping * fix: rename msg to message * fix: wrap prometheus error * fix ci * feat: add deploy manifests and fix metric and trace dashboard bugs (#1387) * feat: add monitoring/dubbo-samples-shop/dubbo-system resources * fix: metric, trace dashboard bug * Fix: Address the admin issues before the release (#1391) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: add Apache License headers to YAML files in release/kubernetes (#1393) * feat: enhance UI components, improve error handling, and add routing rule management (#1394) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: improve error handling and UI updates in GrafanaPage and sceneConfig components - Added conditional checks in GrafanaPage.vue to ensure valid baseURL before constructing the Grafana URL. - Enhanced iframe loading logic to prevent errors when accessing undefined elements. - Updated service.vue to handle potential undefined values in versionGroups, ensuring robust data handling. - Refactored sceneConfig.vue to improve the user experience by adding a conditional rendering for parameter routes, including a message for empty configurations and a button for adding new routes. * refactor: Request to update the Grafana URL * build: build * ♻️ refactor: update route parameters to include name and make pathId/appName optional Update routing structure across instance and traffic management views to: - Add :name parameter to routes for better identification - Make :pathId and :appName optional parameters (with ?) - Affects instance detail, monitor, link tracking, and configuration tabs - Updates dynamic config, routing rule, and tag rule views accordingly This change provides more flexible routing and better resource identification. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * ✨ feat(routing): add routing rule list component and composable Add new RoutingRuleList component and useRoutingRule composable to manage routing rule configurations. Updates addByFormView and updateByFormView to integrate with the new components. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * build: format & build * ✨ feat(routing): enhance routing rule form with comprehensive i18n support Enhance routing rule form functionality with improved internationalization, user interface refinements, and better form handling. - Add comprehensive i18n translations for routing rule fields - Improve form layout and field descriptions - Enhance routing rule list component with better UX - Refactor routing rule composable for better maintainability - Update tab header slots for improved navigation Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * build: format & build --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> * Fix/console (#1397) * fix: create tag rule bug * refactor: config refactor; fix: fix console bugs * fix: instance disable traffic * fix: CI promblems * fix: typo * fix(ui): update footer copyright year to 2026 (#1396) * implement counter by key (#1390) * implement counter by key * chore: trigger CI * Fix counter initialization errors and mesh change detection logic --------- Co-authored-by: WyRainBow <your-email@example.com> * feat: kubernetes deployment manifests and docker file (#1410) * refactor: refactor dockerfile and implement dubbo-admin deployment * fix: deploy manifests * rm: remove useless files (#1416) * feat: implement distributed lock by gorm (#1432) * feat: add leader election for Discovery, Engine, Counter.(#1423) * feat: add leader election for Discovery and Engine components * fix: separate renew/acquire SQL and stop informers on demotion * feat: add leader election for Counter component * fix: resolve copilot review suggestion * fix: GormStore.Pool return value * Feat: Enhance service method retrieval and invocation features (#1429) * feat: add endpoint to retrieve service method names and corresponding request model * feat: add endpoint and logic to retrieve service method details * feat: trim whitespace from service name, mesh, group, version, and provider app name in ServiceMethodsReq * feat: enhance service method handling with overload support and signature retrieval * feat: add generic service invocation support * feat: refactor triple RPC instance selection to use a dedicated target struct * feat: remove obsolete service methods test file * feat: improve error handling in generic service invocation and add parameter count validation * feat: remove unnecessary variable and directly call service.InvokeServiceGeneric in ServiceGenericInvoke * feat: improve query validation by using strutil for blank checks and enhance service provider metadata indexing * feat: add endpoint to retrieve service provider instances and enhance request validation * feat: update service provider instance handling and improve request validation * feat: enhance generic service invocation with protocol and serialization support * feat: add normalization functions for JSON values in generic service invocation * feat: add normalization functions for JSON values in generic service invocation * feat: refine retry logic for service invocation failures * feat(ui-vue3): 添加 mock 数据支持,优化请求配置 - 添加环境变量 `VITE_MOCK_ENABLED` 用于启用 mock 数据模式 - 更新 `package.json` 脚本以添加 `dev:mock` 用于 mock 数据开发环境 - 新增 `mockLogin.ts` 文件,提供 mock 登录和登出接口 - 修改 `request.ts`,根据环境变量切换请求的 `baseURL` - 优化 `main.ts`,根据 mock 模式自动导入 mock API 并更新认证状态 * feat(ui-vue3): 新增 Axios 依赖和 mock 数据接口 - 新增 axios 作为 HTTP 客户端依赖 - 优化 mock 数据接口,包括应用指标、流量权重、灰度配置等 - 更新 package.json 文件以添加 axios 依赖 - 修改多个 mock 接口以适应新的架构和数据结构 * feat(api): 新增 mock 服务方法列表、详情及泛化调用接口 * feat(api): add front func * feat(ui-vue3): improve func empty description * feat(ui-vue3): code format * feat(api): update mock interface * feat(ui-vue3): add elapsed time display for service debug invoke * refactor: replace mockjs with MSW for API mocking Migrate from mockjs to Mock Service Worker (MSW) for a more realistic mock setup that intercepts at the network level. This eliminates the need for a separate mock baseURL and simplifies the mock architecture. - Remove mockjs dependency and all src/api/mock/* files - Add msw with browser worker and handler-based mock definitions - Move mock data to src/mocks/ with per-domain handler organization - Add shared API type definitions in src/types/api.ts - Simplify request.ts baseURL (always /api/v1, MSW handles interception) - Update main.ts mock initialization to use MSW worker * feat(api): refactor service request handling to use BaseServiceReq * feat(api): simplify service provider metadata lookup logic * feat(api): streamline service method resolution and metadata handling * feat(api): enhance ServiceGenericInvokeReq structure and streamline metadata handling * style(debug): format icon imports for improved readability * refactor(api): simplify splitGenericArrayType function by removing redundant checks * chore(deps): downgrade msw and related dependencies to version 2.11.6 * style(debug): improve debug tab UI with typography components and refined styles * style(debug): refine button and typography styles for improved consistency --------- Co-authored-by: 劳资蜀道山 <1493170339@qq.com> * feat: extend indexer with prefix matching and db persistence (#1422) * feat: extend indexer with prefix matching and db persistence * refactor: remove in-memory index from GormStore and add operator field * fix: copilot review suggestion and service panic * update * feat: unify and enhance the lifecycle of an instance (#1440) * feat: add lifecycle state management and color coding for instance statuses * feat: enhance instance lifecycle management with state derivation and UI updates * feat: improve resource handling in informer with enhanced error reporting * feat: enhance instance lifecycle logging with detailed merge and delete events * feat: implement ResourceKeyProvider interface for consistent key generation in informers * refactor: refactor instance resource handling and key function resolution in informers * refactor: remove unused deployState and registerState columns from instance table * feat: enhance runtime instance retrieval with improved matching logic and fallback handling * feat: improve runtime instance identification with enhanced error logging and filtering * feat: add pod watch selector and RPC port identifiers for improved service configuration * feat: add refresh button and localization support for improved user interaction * fix: fix lint * feat: enhance runtime instance retrieval with improved fallback handling and logging for ambiguous matches * fix: enhance instance lifecycle and deployment state management with new types and improved data handling * feat(eventbus): support per-subscriber async dispatch with graceful drain (#1455) * feat(eventbus): support per-subscriber async dispatch with graceful drain * refactor(config): unify AdminConfig method receivers as pointers * refactor(eventbus): move AsyncEnabled into Subscriber with docs * fix(config): keep read-only helpers on value receiver * refactor(config): unify AdminConfig receiver style * feat(mcp): add Model Context Protocol (MCP) server with HTTP transport and authentication ## Summary Implement Model Context Protocol (MCP) server for Dubbo Admin to enable AI integration through standardized tool interfaces. ## Key Features - **Modular Architecture**: Core components (server, registry, tools, transport, types) - **Comprehensive Tool Support**: 11 tools covering cluster info, service discovery, instance management, metrics, and application details - **Dual Transport Support**: - Stdio transport for local Claude Desktop integration - HTTP transport for remote connections with JSON-RPC 2.0 - **Security**: Optional Bearer Token authentication for HTTP endpoint ## Configuration ## Test plan - [x] Unit tests for core components - [x] Integration tests - [x] Manual testing with Claude Desktop Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Service/Application Dependency Graph Implement (#1460) * feat(ui): Added application and service topology mapping feature * style(ui-vue3): Add a minimum width to the login form and remove unnecessary blank lines * Feat: Add service and application topology graph APIs based on discussion #1398 * feat(api): add GraphServices endpoint for service-level topology Based on discussion #1398, use ServiceProviderMetadata and ServiceConsumerMetadata to return provider/consumer application relations as graph nodes and edges for AntV G6. * feat(api): add GraphApplications endpoint for application-level topology Traverse provider/consumer service relations to build application-level graph. Also add idx_service_consumer_service_key index to support efficient serviceKey queries. * feat(api): add graph models (GraphNode, GraphEdge, GraphData) in pkg/console/model/graph.go * feat(api): add ApplicationGraphReq, ServiceGraphReq and GetApplicationGraph, GetServiceGraph handlers * feat(router): register /application/graph and /service/graph routes * feat(api): fix error handling to use direct err pass-through instead of MeshNotFoundError * Feat: Enhance service metadata derivation and detail retrieval ([#1430](#1430)) * feat(api): replace Service.{providers,consumers,features} with {methods} field Simplify Service proto by removing providers, consumers, and features map, keeping only the aggregated methods list derived from provider metadata. * feat(api): derive Service resource from ServiceProviderMetadata on add/update/delete ServiceProviderMetadataEventSubscriber now maintains Service resources by aggregating methods from all provider instances sharing the same serviceKey. Handles add, update, and delete events to keep Service spec in sync. * feat(api): add language detection from provider metadata parameters Detect provider language (golang/java) from metadata parameters and method type signatures when explicit language field is absent. * feat(api): add GetServiceDetail endpoint returning language and methods Add GET /service/detail returning ServiceDetailResp with language and aggregated method names from the derived Service resource. * feat(api): add BuildServiceIdentityKey helper for {service}:{version}:{group} * feat(api): add ByServiceName index for ServiceKind * feat(api): refactor SearchServices to query ServiceResource directly SearchServices and SearchServicesByKeywords now use ServiceResource instead of ServiceProviderMetadataResource for service listing. * feat(api): remove providerAppName from ServiceSearchResp and ServiceTabDistributionReq * feat(api): add ServiceDetailReq and ServiceDetailResp models * feat(router): register /service/detail and /service/interfaces routes * feat(ui-vue3): remove providerAppName from grafana types and tab components * chore: Add G6 chart library and its dependencies to the project * chore(assets): Add Apache license and format code for iconfont file * fix: Correct the naming errors in the application topology graph API parameters and improve the code comments * chore: minor cleanup - fix comment language and import order * chore: translate Chinese comment to English in GraphApplications error handling * chore: reorder imports in service_provider_metadata.go * fix:Fix parameter passing error when obtaining application details * fix: fix type mismatch and index issues in service search and metadata sync 1. pkg/console/service/service.go:132 - fix generic type mismatch with resourceKind - generic ServiceResource should use ServiceKind, was incorrectly passing ServiceProviderMetadataKind - index changed from ByServiceProviderServiceName to ByServiceName (aligned with ServiceKind) 2. pkg/core/discovery/subscriber/service_provider_metadata.go - processUpdate: remove redundant oldRes key check (oldKey always equals newKey in same resource update, else branch is unreachable dead code) - syncService: use ByServiceProviderServiceKey index instead of ByServiceProviderServiceName + manual version/group filtering, reduces data returned from DB and improves performance Ref: [1460](#1460 (comment)) * Feat: Add coding agent domain skills ([#1457](#1457)) * feat(skills): add backend domain skills for runtime, discovery, engine, events, store, and Console API Document component lifecycle, ListAndWatch discovery, resource engine behavior, EventBus dispatching, storage indexes, and Web MVC flow for coding agents. * feat(skills): add frontend domain skill for routing, components, and traffic rule forms Document Vue frontend structure, API clients, Pinia state, route metadata, layout tabs, and traffic rule form design. * feat(skills): add OpenAI skill metadata Add agents/openai.yaml metadata for each dubbo-admin domain skill. * fix(console): use ServiceKind for service list search Query ServiceResource from ServiceKind instead of ServiceProviderMetadataKind so the non-keyword service list path uses the matching resource store and index set. --------- Co-authored-by: sohandsomejie <3080955413@qq.com> Co-authored-by: MoChengqian <2972013548@qq.com> * Implement MCP client and refactor MCP module structure - Implement MCP client for AI service to call admin: - Add pkg/mcp/server.go with JSON-RPC 2.0 protocol support - Add pkg/mcp/register.go for tool registration - Implement 11 MCP tools: cluster_info, search, service, instance, application - Integrate MCP endpoint with console component (/api/mcp) - Restructure pkg/mcp directory with clearer organization: - Move common types and utilities to pkg/mcp/common/ - Consolidate tool handlers in pkg/mcp/tools/ - Remove obsolete registry and core modules - Add DEVELOPMENT.md with comprehensive tool development guide - Update AI integration to use new MCP structure Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: robb <robocanic@gmail.com> Co-authored-by: marsevilspirit <marsevilspirit@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: WyRainBow <weiyu9484@gmail.com> Co-authored-by: LGgbond <1493170339@qq.com> Co-authored-by: Helltab <939255879@qq.com> Co-authored-by: Tew <finntew@outlook.com> Co-authored-by: EVERFID <166227111+everfid-ever@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: Akshit Vig <akshitvig48@gmail.com> Co-authored-by: WyRainBow <your-email@example.com> Co-authored-by: EVERFID <3085640487@qq.com> Co-authored-by: ThunGuo <tew@apache.org> Co-authored-by: Zerui Yang <zeruiyoung@gmail.com> Co-authored-by: LunaRain_079 <2074730050@qq.com> Co-authored-by: Comrade Yi <119987662+ambiguous-pointer@users.noreply.github.com> Co-authored-by: sohandsomejie <3080955413@qq.com> Co-authored-by: MoChengqian <2972013548@qq.com>
…#1470) * feat: informer general framework and engine/discovery interface definition (apache#1314) * feat: informer general framework and engine/discovery interface definition * fix: ci problem; directory and dependency tidy (apache#1320) * fix: ci probelm; diretory and dependency tidy * fix: lack license header * rm: remove redundant file * ci(makefile): add makefile for ci (apache#1322) * ci(makefile): add makefile for ci * style(ci): rename dubbo-admin ci * delete unused ci (apache#1326) * fix: refractor web handler and service to fix compile error; (apache#1325) * fix: refractor web handler and service to fix compile error; * feat: support memory type of store (apache#1332) * feat: support memory type of store * fix: muilti indexes should use intersecection * simplify code Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * refractor: GetByKeys return a list instead of map --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: support kubernetes as a backend engine (apache#1340) * feat: implement runtime engine using kubernetes * feat: Defined a unified error (apache#1353) * feat: unified error code; separate application handler and service into parts * fix: license header lack * fix: copilot review err fix * fix: simplify the if-else condition * chore: rename Error() to String() * chore: add extra String() in Error * feat: 新增listMeshes接口 * fix: copilot review * Implment Counter in local cache (apache#1345) * fix: update response interceptor to handle success and error messages more accurately (apache#1355) * feat(UI): Support multiple registries (apache#1356) * feat(apache#1352): Support multiple registries: add registry select box and refresh main area on change * doc(build): build ui * fix(apache#1352): Set first available mesh after login when no mesh is set * doc(build): build ui * fix(conflict) * doc(build): build ui * feat: implement mysql and postgresql store for resources (apache#1360) * feat: implement mysql and postgresql store for resources * fix some issues * ut: add some test cases * fix: dynamic table name * feat: implements discovery backend by nacos (apache#1367) * feat: support nacos2 to do discovery * refractor: abstract nacos and nacos service * fix: unit test and license header * fix: copilot review problem * chore: remove redundant code * fix counter bug (apache#1369) * fix: add indexer before init cause npe (apache#1372) * fix: add indexer before init cause npe * fix: unit test * Fix: Redirect to login page when receiving 401 unauthorized response from API (apache#1373) * feat: enhance error handling for unauthorized access and improve toast messages * feat: enhance error handling for unauthorized access and improve toast messages * fix: correct syntax error in response interceptor for redirect handling * Update ui-vue3/src/base/http/request.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: add YAML and XML editor components, update index references, and enhance error logging - Introduced new JavaScript files for YAML and XML syntax highlighting and editing capabilities. - Added a new component for updating YAML configurations with a structured editor interface. - Updated the index.html to reference the new JavaScript bundle for improved functionality. - Enhanced the HTTP request module to log errors during redirection on 401 responses for better debugging. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: implement discovery backend by zk (apache#1371) * feat: implements discovery backend by zk * feat: support components to start in dependency order (apache#1370) * feat: support components to start in dependency order * imporve * fix * fix error import * release changelog (apache#1376) * changelog * chore: rename refactor to enhancements * refactor: 🎨 Optimize UI styles and search functionality (apache#1379) * feat: enhance error handling for unauthorized access and improve toast messages * feat: enhance error handling for unauthorized access and improve toast messages * fix: correct syntax error in response interceptor for redirect handling * Update ui-vue3/src/base/http/request.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: add YAML and XML editor components, update index references, and enhance error logging - Introduced new JavaScript files for YAML and XML syntax highlighting and editing capabilities. - Added a new component for updating YAML configurations with a structured editor interface. - Updated the index.html to reference the new JavaScript bundle for improved functionality. - Enhanced the HTTP request module to log errors during redirection on 401 responses for better debugging. * docs: Only supports exact matching; remove the "prefix search" function from the placeholder (background word) * docs: All sorting indicators for lists are initially hidden, including but not limited to the list pages for applications, instances, services, and traffic management * refactor: 🎨 Optimize the styles of some tables and adapt to backend changes * docs: api baseurl --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(ui): Enhance service metrics display and optimize table UI styles (apache#1383) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components (apache#1385) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: fix console bugs and makes console functions effective (apache#1378) * fix: console interfaces;feat: implements governor using zk and nacos * fix: instance subscriber * fix: unit-test * fix: rules search * resolve conflicts * fix: backend bugs * fix: rule handler and service refactor * fix: config error andd field mapping * fix: rename msg to message * fix: wrap prometheus error * fix ci * feat: add deploy manifests and fix metric and trace dashboard bugs (apache#1387) * feat: add monitoring/dubbo-samples-shop/dubbo-system resources * fix: metric, trace dashboard bug * Fix: Address the admin issues before the release (apache#1391) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: add Apache License headers to YAML files in release/kubernetes (apache#1393) * feat: enhance UI components, improve error handling, and add routing rule management (apache#1394) * build: Optimize the styles of some tables, adapt to backend changes, format the code, and package it * chore: remove PR_DESCRIPTION.md file as it is no longer needed * fix: update routing rule handling updated routing rule handling to use constants for HTTP status codes in various components. * build: build & format * feat: enhance error handling and data loading in various components - Added a silent error handling mechanism for specific URLs in the HTTP request module to suppress error messages. - Refactored data loading logic in sceneConfig.vue to load configuration data based on the selected tab, improving user experience. - Updated YAMLView.vue and other components to remove unused button code and optimize imports, enhancing code clarity and maintainability. - Improved error handling in routingRule and dynamicConfig components to ensure better user feedback and debugging. * feat: add new components and enhance YAML and XML editing capabilities - Introduced new JavaScript files for YAML and XML syntax highlighting and editing. - Added components for updating YAML configurations with structured editor interfaces. - Updated index.html to reference new JavaScript bundles for improved functionality. - Enhanced error handling and logging in various components for better debugging. - Removed unused code and optimized imports in YAMLView and related components. * feat: enhance UI components and improve error handling - Added global styles for clickable links in tables to improve user interaction. - Updated routing logic to utilize a dynamic header parameter key for better flexibility. - Enhanced error handling in HTTP requests to suppress messages for specific URLs. - Improved internationalization by adding new translation keys for 'Ready Time' in both English and Chinese. - Refactored various components to optimize code structure and maintainability, including updates to YAML and form views. - Adjusted table and form layouts for better responsiveness and user experience. * refactor: streamline component code and enhance condition handling - Simplified iframe rendering in GrafanaPage.vue for improved readability. - Added checks in ConfigModel.ts to skip undefined keys in matches and parameters. - Optimized YAMLView.vue by condensing MonacoEditor properties for better clarity. - Cleared default request and address matching arrays in formView.vue for cleaner initialization. - Enhanced condition parsing and merging logic in updateByFormView.vue to improve maintainability and readability. * build: build admin * fix: improve error handling and UI updates in GrafanaPage and sceneConfig components - Added conditional checks in GrafanaPage.vue to ensure valid baseURL before constructing the Grafana URL. - Enhanced iframe loading logic to prevent errors when accessing undefined elements. - Updated service.vue to handle potential undefined values in versionGroups, ensuring robust data handling. - Refactored sceneConfig.vue to improve the user experience by adding a conditional rendering for parameter routes, including a message for empty configurations and a button for adding new routes. * refactor: Request to update the Grafana URL * build: build * ♻️ refactor: update route parameters to include name and make pathId/appName optional Update routing structure across instance and traffic management views to: - Add :name parameter to routes for better identification - Make :pathId and :appName optional parameters (with ?) - Affects instance detail, monitor, link tracking, and configuration tabs - Updates dynamic config, routing rule, and tag rule views accordingly This change provides more flexible routing and better resource identification. * ✨ feat(routing): add routing rule list component and composable Add new RoutingRuleList component and useRoutingRule composable to manage routing rule configurations. Updates addByFormView and updateByFormView to integrate with the new components. * build: format & build * ✨ feat(routing): enhance routing rule form with comprehensive i18n support Enhance routing rule form functionality with improved internationalization, user interface refinements, and better form handling. - Add comprehensive i18n translations for routing rule fields - Improve form layout and field descriptions - Enhance routing rule list component with better UX - Refactor routing rule composable for better maintainability - Update tab header slots for improved navigation * build: format & build --------- * Fix/console (apache#1397) * fix: create tag rule bug * refactor: config refactor; fix: fix console bugs * fix: instance disable traffic * fix: CI promblems * fix: typo * fix(ui): update footer copyright year to 2026 (apache#1396) * implement counter by key (apache#1390) * implement counter by key * chore: trigger CI * Fix counter initialization errors and mesh change detection logic --------- Co-authored-by: WyRainBow <your-email@example.com> * feat: kubernetes deployment manifests and docker file (apache#1410) * refactor: refactor dockerfile and implement dubbo-admin deployment * fix: deploy manifests * rm: remove useless files (apache#1416) * feat: implement distributed lock by gorm (apache#1432) * feat: add leader election for Discovery, Engine, Counter.(apache#1423) * feat: add leader election for Discovery and Engine components * fix: separate renew/acquire SQL and stop informers on demotion * feat: add leader election for Counter component * fix: resolve copilot review suggestion * fix: GormStore.Pool return value * Feat: Enhance service method retrieval and invocation features (apache#1429) * feat: add endpoint to retrieve service method names and corresponding request model * feat: add endpoint and logic to retrieve service method details * feat: trim whitespace from service name, mesh, group, version, and provider app name in ServiceMethodsReq * feat: enhance service method handling with overload support and signature retrieval * feat: add generic service invocation support * feat: refactor triple RPC instance selection to use a dedicated target struct * feat: remove obsolete service methods test file * feat: improve error handling in generic service invocation and add parameter count validation * feat: remove unnecessary variable and directly call service.InvokeServiceGeneric in ServiceGenericInvoke * feat: improve query validation by using strutil for blank checks and enhance service provider metadata indexing * feat: add endpoint to retrieve service provider instances and enhance request validation * feat: update service provider instance handling and improve request validation * feat: enhance generic service invocation with protocol and serialization support * feat: add normalization functions for JSON values in generic service invocation * feat: add normalization functions for JSON values in generic service invocation * feat: refine retry logic for service invocation failures * feat(ui-vue3): 添加 mock 数据支持,优化请求配置 - 添加环境变量 `VITE_MOCK_ENABLED` 用于启用 mock 数据模式 - 更新 `package.json` 脚本以添加 `dev:mock` 用于 mock 数据开发环境 - 新增 `mockLogin.ts` 文件,提供 mock 登录和登出接口 - 修改 `request.ts`,根据环境变量切换请求的 `baseURL` - 优化 `main.ts`,根据 mock 模式自动导入 mock API 并更新认证状态 * feat(ui-vue3): 新增 Axios 依赖和 mock 数据接口 - 新增 axios 作为 HTTP 客户端依赖 - 优化 mock 数据接口,包括应用指标、流量权重、灰度配置等 - 更新 package.json 文件以添加 axios 依赖 - 修改多个 mock 接口以适应新的架构和数据结构 * feat(api): 新增 mock 服务方法列表、详情及泛化调用接口 * feat(api): add front func * feat(ui-vue3): improve func empty description * feat(ui-vue3): code format * feat(api): update mock interface * feat(ui-vue3): add elapsed time display for service debug invoke * refactor: replace mockjs with MSW for API mocking Migrate from mockjs to Mock Service Worker (MSW) for a more realistic mock setup that intercepts at the network level. This eliminates the need for a separate mock baseURL and simplifies the mock architecture. - Remove mockjs dependency and all src/api/mock/* files - Add msw with browser worker and handler-based mock definitions - Move mock data to src/mocks/ with per-domain handler organization - Add shared API type definitions in src/types/api.ts - Simplify request.ts baseURL (always /api/v1, MSW handles interception) - Update main.ts mock initialization to use MSW worker * feat(api): refactor service request handling to use BaseServiceReq * feat(api): simplify service provider metadata lookup logic * feat(api): streamline service method resolution and metadata handling * feat(api): enhance ServiceGenericInvokeReq structure and streamline metadata handling * style(debug): format icon imports for improved readability * refactor(api): simplify splitGenericArrayType function by removing redundant checks * chore(deps): downgrade msw and related dependencies to version 2.11.6 * style(debug): improve debug tab UI with typography components and refined styles * style(debug): refine button and typography styles for improved consistency --------- Co-authored-by: 劳资蜀道山 <1493170339@qq.com> * feat: extend indexer with prefix matching and db persistence (apache#1422) * feat: extend indexer with prefix matching and db persistence * refactor: remove in-memory index from GormStore and add operator field * fix: copilot review suggestion and service panic * update * feat: unify and enhance the lifecycle of an instance (apache#1440) * feat: add lifecycle state management and color coding for instance statuses * feat: enhance instance lifecycle management with state derivation and UI updates * feat: improve resource handling in informer with enhanced error reporting * feat: enhance instance lifecycle logging with detailed merge and delete events * feat: implement ResourceKeyProvider interface for consistent key generation in informers * refactor: refactor instance resource handling and key function resolution in informers * refactor: remove unused deployState and registerState columns from instance table * feat: enhance runtime instance retrieval with improved matching logic and fallback handling * feat: improve runtime instance identification with enhanced error logging and filtering * feat: add pod watch selector and RPC port identifiers for improved service configuration * feat: add refresh button and localization support for improved user interaction * fix: fix lint * feat: enhance runtime instance retrieval with improved fallback handling and logging for ambiguous matches * fix: enhance instance lifecycle and deployment state management with new types and improved data handling * feat(eventbus): support per-subscriber async dispatch with graceful drain (apache#1455) * feat(eventbus): support per-subscriber async dispatch with graceful drain * refactor(config): unify AdminConfig method receivers as pointers * refactor(eventbus): move AsyncEnabled into Subscriber with docs * fix(config): keep read-only helpers on value receiver * refactor(config): unify AdminConfig receiver style * feat(mcp): add Model Context Protocol (MCP) server with HTTP transport and authentication ## Summary Implement Model Context Protocol (MCP) server for Dubbo Admin to enable AI integration through standardized tool interfaces. ## Key Features - **Modular Architecture**: Core components (server, registry, tools, transport, types) - **Comprehensive Tool Support**: 11 tools covering cluster info, service discovery, instance management, metrics, and application details - **Dual Transport Support**: - Stdio transport for local Claude Desktop integration - HTTP transport for remote connections with JSON-RPC 2.0 - **Security**: Optional Bearer Token authentication for HTTP endpoint ## Configuration ## Test plan - [x] Unit tests for core components - [x] Integration tests - [x] Manual testing with Claude Desktop * Service/Application Dependency Graph Implement (apache#1460) * feat(ui): Added application and service topology mapping feature * style(ui-vue3): Add a minimum width to the login form and remove unnecessary blank lines * Feat: Add service and application topology graph APIs based on discussion apache#1398 * feat(api): add GraphServices endpoint for service-level topology Based on discussion apache#1398, use ServiceProviderMetadata and ServiceConsumerMetadata to return provider/consumer application relations as graph nodes and edges for AntV G6. * feat(api): add GraphApplications endpoint for application-level topology Traverse provider/consumer service relations to build application-level graph. Also add idx_service_consumer_service_key index to support efficient serviceKey queries. * feat(api): add graph models (GraphNode, GraphEdge, GraphData) in pkg/console/model/graph.go * feat(api): add ApplicationGraphReq, ServiceGraphReq and GetApplicationGraph, GetServiceGraph handlers * feat(router): register /application/graph and /service/graph routes * feat(api): fix error handling to use direct err pass-through instead of MeshNotFoundError * Feat: Enhance service metadata derivation and detail retrieval ([apache#1430](apache#1430)) * feat(api): replace Service.{providers,consumers,features} with {methods} field Simplify Service proto by removing providers, consumers, and features map, keeping only the aggregated methods list derived from provider metadata. * feat(api): derive Service resource from ServiceProviderMetadata on add/update/delete ServiceProviderMetadataEventSubscriber now maintains Service resources by aggregating methods from all provider instances sharing the same serviceKey. Handles add, update, and delete events to keep Service spec in sync. * feat(api): add language detection from provider metadata parameters Detect provider language (golang/java) from metadata parameters and method type signatures when explicit language field is absent. * feat(api): add GetServiceDetail endpoint returning language and methods Add GET /service/detail returning ServiceDetailResp with language and aggregated method names from the derived Service resource. * feat(api): add BuildServiceIdentityKey helper for {service}:{version}:{group} * feat(api): add ByServiceName index for ServiceKind * feat(api): refactor SearchServices to query ServiceResource directly SearchServices and SearchServicesByKeywords now use ServiceResource instead of ServiceProviderMetadataResource for service listing. * feat(api): remove providerAppName from ServiceSearchResp and ServiceTabDistributionReq * feat(api): add ServiceDetailReq and ServiceDetailResp models * feat(router): register /service/detail and /service/interfaces routes * feat(ui-vue3): remove providerAppName from grafana types and tab components * chore: Add G6 chart library and its dependencies to the project * chore(assets): Add Apache license and format code for iconfont file * fix: Correct the naming errors in the application topology graph API parameters and improve the code comments * chore: minor cleanup - fix comment language and import order * chore: translate Chinese comment to English in GraphApplications error handling * chore: reorder imports in service_provider_metadata.go * fix:Fix parameter passing error when obtaining application details * fix: fix type mismatch and index issues in service search and metadata sync 1. pkg/console/service/service.go:132 - fix generic type mismatch with resourceKind - generic ServiceResource should use ServiceKind, was incorrectly passing ServiceProviderMetadataKind - index changed from ByServiceProviderServiceName to ByServiceName (aligned with ServiceKind) 2. pkg/core/discovery/subscriber/service_provider_metadata.go - processUpdate: remove redundant oldRes key check (oldKey always equals newKey in same resource update, else branch is unreachable dead code) - syncService: use ByServiceProviderServiceKey index instead of ByServiceProviderServiceName + manual version/group filtering, reduces data returned from DB and improves performance Ref: [1460](apache#1460 (comment)) * Feat: Add coding agent domain skills ([apache#1457](apache#1457)) * feat(skills): add backend domain skills for runtime, discovery, engine, events, store, and Console API Document component lifecycle, ListAndWatch discovery, resource engine behavior, EventBus dispatching, storage indexes, and Web MVC flow for coding agents. * feat(skills): add frontend domain skill for routing, components, and traffic rule forms Document Vue frontend structure, API clients, Pinia state, route metadata, layout tabs, and traffic rule form design. * feat(skills): add OpenAI skill metadata Add agents/openai.yaml metadata for each dubbo-admin domain skill. * fix(console): use ServiceKind for service list search Query ServiceResource from ServiceKind instead of ServiceProviderMetadataKind so the non-keyword service list path uses the matching resource store and index set. --------- Co-authored-by: sohandsomejie <3080955413@qq.com> Co-authored-by: MoChengqian <2972013548@qq.com> --------- Co-authored-by: robb <robocanic@gmail.com> Co-authored-by: marsevilspirit <marsevilspirit@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: WyRainBow <weiyu9484@gmail.com> Co-authored-by: LGgbond <1493170339@qq.com> Co-authored-by: Helltab <939255879@qq.com> Co-authored-by: Tew <finntew@outlook.com> Co-authored-by: EVERFID <166227111+everfid-ever@users.noreply.github.com> Co-authored-by: Akshit Vig <akshitvig48@gmail.com> Co-authored-by: WyRainBow <your-email@example.com> Co-authored-by: EVERFID <3085640487@qq.com> Co-authored-by: ThunGuo <tew@apache.org> Co-authored-by: Zerui Yang <zeruiyoung@gmail.com> Co-authored-by: LunaRain_079 <2074730050@qq.com> Co-authored-by: Comrade Yi <119987662+ambiguous-pointer@users.noreply.github.com> Co-authored-by: sohandsomejie <3080955413@qq.com> Co-authored-by: MoChengqian <2972013548@qq.com>



implement counter by key