-
Notifications
You must be signed in to change notification settings - Fork 8.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ML] Versioning all ML APIs #156949
[ML] Versioning all ML APIs #156949
Conversation
* Extract unique influencers from the job or collection of jobs | ||
* @param jobs | ||
*/ | ||
export function extractInfluencers(jobs: Job | Job[]): string[] { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
moved from AnomalyDetectorService
as it doesn't need to live inside the class.
|
||
constructor(private httpService: HttpService) {} | ||
constructor(httpService: HttpService) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've updated this class to remove the API calls directly using http
.
It now uses our standard api service where I've added a observable based version of getJobs
.
I've also removed the extractInfluencers
method as has no dependencies on class member data and so can live with our other job utils functions.
|
||
return new Promise(async (resolve, reject) => { | ||
try { | ||
const { jobIds } = await resolveJobSelection(coreStart, input?.jobIds); | ||
const title = input?.title ?? getDefaultSwimlanePanelTitle(jobIds); | ||
const jobs = await lastValueFrom(anomalyDetectorService.getJobs$(jobIds)); | ||
const influencers = anomalyDetectorService.extractInfluencers(jobs); | ||
const { jobs } = await getJobs({ jobId: jobIds.join(',') }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've switched this to use our standard getJobs
function as it doesn't need to use the observable based one supplied by the AnomalyDetectorService
class.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uptime Changes LGTM !!
@@ -28,7 +28,7 @@ import type { | |||
export const savedObjectsApiProvider = (httpService: HttpService) => ({ | |||
jobsSpaces() { | |||
return httpService.http<JobsSpacesResponse>({ | |||
path: `${basePath()}/saved_objects/jobs_spaces`, | |||
path: `${ML_INTERNAL_BASE_PATH}/saved_objects/jobs_spaces`, | |||
method: 'GET', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is version needed here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
10 points for discovering the deliberate mistake!
Route updated in df24ed4
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM ⚡
For calls in
Usage is for |
This is a very good question. The file upload plugin isn't versioned at the moment, but when it is the two versions may diverge at some point in the future. We should do some refactoring to remove the need for the path to passed in. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Detections Response - changes tested, LGTM 👍
💛 Build succeeded, but was flaky
Failed CI StepsMetrics [docs]Async chunks
Page load bundle
Unknown metric groupsESLint disabled line counts
Total ESLint disabled count
History
To update your PR or re-run it, just comment with: |
LGTM 🎉 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code review only check
Adds versioning to all of the ML kibana APIs. Versions are added to the server side routes and to the client side functions which call the routes. Makes some small refactors to ensure only the functions inside `ml/public/application/services/ml_api_service/` are where the ML APIs are called. Updates external plugins which call ML APIs to add the new versioning. Updates API tests to add the API version to the request headers. Our one public API has been given the version `'2023-05-15'`, all of the internal APIs have been given the version `'1'`. **Public APIs:** `/api/ml/saved_objects/sync` **Internal APIS:** `/internal/ml/alerting/preview` `/internal/ml/annotations` `/internal/ml/annotations/index` `/internal/ml/annotations/delete/{annotationId}` `/internal/ml/anomaly_detectors` `/internal/ml/anomaly_detectors/{jobId}` `/internal/ml/anomaly_detectors/_stats` `/internal/ml/anomaly_detectors/{jobId}/_stats` `/internal/ml/anomaly_detectors/{jobId}` `/internal/ml/anomaly_detectors/{jobId}/_update` `/internal/ml/anomaly_detectors/{jobId}/_open` `/internal/ml/anomaly_detectors/{jobId}/_close` `/internal/ml/anomaly_detectors/{jobId}/_reset` `/internal/ml/anomaly_detectors/{jobId}` `/internal/ml/anomaly_detectors/_validate/detector` `/internal/ml/anomaly_detectors/{jobId}/_forecast` `/internal/ml/anomaly_detectors/{jobId}/results/records` `/internal/ml/anomaly_detectors/{jobId}/results/buckets/{timestamp?}` `/internal/ml/anomaly_detectors/{jobId}/results/overall_buckets` `/internal/ml/anomaly_detectors/{jobId}/results/categories/{categoryId}` `/internal/ml/anomaly_detectors/{jobId}/model_snapshots` `/internal/ml/anomaly_detectors/{jobId}/model_snapshots/{snapshotId}` `/internal/ml/anomaly_detectors/{jobId}/model_snapshots/{snapshotId}/_update` `/internal/ml/anomaly_detectors/{jobId}/model_snapshots/{snapshotId}` `/internal/ml/calendars` `/internal/ml/calendars/{calendarIds}` `/internal/ml/calendars` `/internal/ml/calendars/{calendarId}` `/internal/ml/calendars/{calendarId}` `/internal/ml/data_frame/analytics` `/internal/ml/data_frame/analytics/{analyticsId}` `/internal/ml/data_frame/analytics/_stats` `/internal/ml/data_frame/analytics/{analyticsId}/_stats` `/internal/ml/data_frame/analytics/{analyticsId}` `/internal/ml/data_frame/_evaluate` `/internal/ml/data_frame/analytics/_explain` `/internal/ml/data_frame/analytics/{analyticsId}` `/internal/ml/data_frame/analytics/{analyticsId}/_start` `/internal/ml/data_frame/analytics/{analyticsId}/_stop` `/internal/ml/data_frame/analytics/{analyticsId}/_update` `/internal/ml/data_frame/analytics/{analyticsId}/messages` `/internal/ml/data_frame/analytics/jobs_exist` `/internal/ml/data_frame/analytics/map/{analyticsId}` `/internal/ml/data_frame/analytics/new_job_caps/{indexPattern}` `/internal/ml/data_frame/analytics/validate` `/internal/ml/data_visualizer/get_field_histograms/{indexPattern}` `/internal/ml/datafeeds` `/internal/ml/datafeeds/{datafeedId}` `/internal/ml/datafeeds/_stats` `/internal/ml/datafeeds/{datafeedId}/_stats` `/internal/ml/datafeeds/{datafeedId}` `/internal/ml/datafeeds/{datafeedId}/_update` `/internal/ml/datafeeds/{datafeedId}` `/internal/ml/datafeeds/{datafeedId}/_start` `/internal/ml/datafeeds/{datafeedId}/_stop` `/internal/ml/datafeeds/{datafeedId}/_preview` `/internal/ml/fields_service/field_cardinality` `/internal/ml/fields_service/time_field_range` `/internal/ml/filters` `/internal/ml/filters/{filterId}` `/internal/ml/filters` `/internal/ml/filters/{filterId}` `/internal/ml/filters/{filterId}` `/internal/ml/filters/_stats` `/internal/ml/indices/field_caps` `/internal/ml/job_audit_messages/messages/{jobId}` `/internal/ml/job_audit_messages/messages` `/internal/ml/job_audit_messages/clear_messages` `/internal/ml/jobs/force_start_datafeeds` `/internal/ml/jobs/stop_datafeeds` `/internal/ml/jobs/delete_jobs` `/internal/ml/jobs/close_jobs` `/internal/ml/jobs/reset_jobs` `/internal/ml/jobs/force_stop_and_close_job` `/internal/ml/jobs/jobs_summary` `/internal/ml/jobs/jobs_with_geo` `/internal/ml/jobs/jobs_with_time_range` `/internal/ml/jobs/job_for_cloning` `/internal/ml/jobs/jobs` `/internal/ml/jobs/groups` `/internal/ml/jobs/update_groups` `/internal/ml/jobs/blocking_jobs_tasks` `/internal/ml/jobs/jobs_exist` `/internal/ml/jobs/new_job_caps/{indexPattern}` `/internal/ml/jobs/new_job_line_chart` `/internal/ml/jobs/new_job_population_chart` `/internal/ml/jobs/all_jobs_and_group_ids` `/internal/ml/jobs/look_back_progress` `/internal/ml/jobs/categorization_field_examples` `/internal/ml/jobs/top_categories` `/internal/ml/jobs/datafeed_preview` `/internal/ml/jobs/revert_model_snapshot` `/internal/ml/jobs/bulk_create` `/internal/ml/validate/estimate_bucket_span` `/internal/ml/validate/calculate_model_memory_limit` `/internal/ml/validate/cardinality` `/internal/ml/validate/job` `/internal/ml/validate/datafeed_preview` `/internal/ml/json_schema` `/internal/ml/management/list/{listType}` `/internal/ml/model_management/nodes_overview` `/internal/ml/model_management/memory_usage` `/internal/ml/modules/recognize/{indexPatternTitle}` `/internal/ml/modules/get_module/{moduleId?}` `/internal/ml/modules/setup/{moduleId}` `/internal/ml/modules/jobs_exist/{moduleId}` `/internal/ml/notifications` `/internal/ml/notifications/count` `/internal/ml/results/anomalies_table_data` `/internal/ml/results/category_definition` `/internal/ml/results/max_anomaly_score` `/internal/ml/results/category_examples` `/internal/ml/results/partition_fields_values` `/internal/ml/results/anomaly_search` `/internal/ml/results/{jobId}/categorizer_stats` `/internal/ml/results/category_stopped_partitions` `/internal/ml/results/datafeed_results_chart` `/internal/ml/results/anomaly_charts` `/internal/ml/results/anomaly_records` `/internal/ml/saved_objects/status` `/internal/ml/saved_objects/initialize` `/internal/ml/saved_objects/sync_check` `/internal/ml/saved_objects/update_jobs_spaces` `/internal/ml/saved_objects/update_trained_models_spaces` `/internal/ml/saved_objects/remove_item_from_current_space` `/internal/ml/saved_objects/jobs_spaces` `/internal/ml/saved_objects/trained_models_spaces` `/internal/ml/saved_objects/can_delete_ml_space_aware_item/{jobType}` `/internal/ml/_has_privileges` `/internal/ml/ml_capabilities` `/internal/ml/ml_node_count` `/internal/ml/info` `/internal/ml/es_search` `/internal/ml/index_exists` `/internal/ml/trained_models/{modelId?}` `/internal/ml/trained_models/_stats` `/internal/ml/trained_models/{modelId}/_stats` `/internal/ml/trained_models/{modelId}/pipelines` `/internal/ml/trained_models/{modelId}` `/internal/ml/trained_models/{modelId}` `/internal/ml/trained_models/{modelId}/deployment/_start` `/internal/ml/trained_models/{modelId}/{deploymentId}/deployment/_update` `/internal/ml/trained_models/{modelId}/{deploymentId}/deployment/_stop` `/internal/ml/trained_models/pipeline_simulate` `/internal/ml/trained_models/infer/{modelId}/{deploymentId}`
Adds versioning to all of the ML kibana APIs.
Versions are added to the server side routes and to the client side functions which call the routes.
Makes some small refactors to ensure only the functions inside
ml/public/application/services/ml_api_service/
are where the ML APIs are called.Updates external plugins which call ML APIs to add the new versioning.
Updates API tests to add the API version to the request headers.
Our one public API has been given the version
'2023-05-15'
, all of the internal APIs have been given the version'1'
.Public APIs:
/api/ml/saved_objects/sync
Internal APIS:
/internal/ml/alerting/preview
/internal/ml/annotations
/internal/ml/annotations/index
/internal/ml/annotations/delete/{annotationId}
/internal/ml/anomaly_detectors
/internal/ml/anomaly_detectors/{jobId}
/internal/ml/anomaly_detectors/_stats
/internal/ml/anomaly_detectors/{jobId}/_stats
/internal/ml/anomaly_detectors/{jobId}
/internal/ml/anomaly_detectors/{jobId}/_update
/internal/ml/anomaly_detectors/{jobId}/_open
/internal/ml/anomaly_detectors/{jobId}/_close
/internal/ml/anomaly_detectors/{jobId}/_reset
/internal/ml/anomaly_detectors/{jobId}
/internal/ml/anomaly_detectors/_validate/detector
/internal/ml/anomaly_detectors/{jobId}/_forecast
/internal/ml/anomaly_detectors/{jobId}/results/records
/internal/ml/anomaly_detectors/{jobId}/results/buckets/{timestamp?}
/internal/ml/anomaly_detectors/{jobId}/results/overall_buckets
/internal/ml/anomaly_detectors/{jobId}/results/categories/{categoryId}
/internal/ml/anomaly_detectors/{jobId}/model_snapshots
/internal/ml/anomaly_detectors/{jobId}/model_snapshots/{snapshotId}
/internal/ml/anomaly_detectors/{jobId}/model_snapshots/{snapshotId}/_update
/internal/ml/anomaly_detectors/{jobId}/model_snapshots/{snapshotId}
/internal/ml/calendars
/internal/ml/calendars/{calendarIds}
/internal/ml/calendars
/internal/ml/calendars/{calendarId}
/internal/ml/calendars/{calendarId}
/internal/ml/data_frame/analytics
/internal/ml/data_frame/analytics/{analyticsId}
/internal/ml/data_frame/analytics/_stats
/internal/ml/data_frame/analytics/{analyticsId}/_stats
/internal/ml/data_frame/analytics/{analyticsId}
/internal/ml/data_frame/_evaluate
/internal/ml/data_frame/analytics/_explain
/internal/ml/data_frame/analytics/{analyticsId}
/internal/ml/data_frame/analytics/{analyticsId}/_start
/internal/ml/data_frame/analytics/{analyticsId}/_stop
/internal/ml/data_frame/analytics/{analyticsId}/_update
/internal/ml/data_frame/analytics/{analyticsId}/messages
/internal/ml/data_frame/analytics/jobs_exist
/internal/ml/data_frame/analytics/map/{analyticsId}
/internal/ml/data_frame/analytics/new_job_caps/{indexPattern}
/internal/ml/data_frame/analytics/validate
/internal/ml/data_visualizer/get_field_histograms/{indexPattern}
/internal/ml/datafeeds
/internal/ml/datafeeds/{datafeedId}
/internal/ml/datafeeds/_stats
/internal/ml/datafeeds/{datafeedId}/_stats
/internal/ml/datafeeds/{datafeedId}
/internal/ml/datafeeds/{datafeedId}/_update
/internal/ml/datafeeds/{datafeedId}
/internal/ml/datafeeds/{datafeedId}/_start
/internal/ml/datafeeds/{datafeedId}/_stop
/internal/ml/datafeeds/{datafeedId}/_preview
/internal/ml/fields_service/field_cardinality
/internal/ml/fields_service/time_field_range
/internal/ml/filters
/internal/ml/filters/{filterId}
/internal/ml/filters
/internal/ml/filters/{filterId}
/internal/ml/filters/{filterId}
/internal/ml/filters/_stats
/internal/ml/indices/field_caps
/internal/ml/job_audit_messages/messages/{jobId}
/internal/ml/job_audit_messages/messages
/internal/ml/job_audit_messages/clear_messages
/internal/ml/jobs/force_start_datafeeds
/internal/ml/jobs/stop_datafeeds
/internal/ml/jobs/delete_jobs
/internal/ml/jobs/close_jobs
/internal/ml/jobs/reset_jobs
/internal/ml/jobs/force_stop_and_close_job
/internal/ml/jobs/jobs_summary
/internal/ml/jobs/jobs_with_geo
/internal/ml/jobs/jobs_with_time_range
/internal/ml/jobs/job_for_cloning
/internal/ml/jobs/jobs
/internal/ml/jobs/groups
/internal/ml/jobs/update_groups
/internal/ml/jobs/blocking_jobs_tasks
/internal/ml/jobs/jobs_exist
/internal/ml/jobs/new_job_caps/{indexPattern}
/internal/ml/jobs/new_job_line_chart
/internal/ml/jobs/new_job_population_chart
/internal/ml/jobs/all_jobs_and_group_ids
/internal/ml/jobs/look_back_progress
/internal/ml/jobs/categorization_field_examples
/internal/ml/jobs/top_categories
/internal/ml/jobs/datafeed_preview
/internal/ml/jobs/revert_model_snapshot
/internal/ml/jobs/bulk_create
/internal/ml/validate/estimate_bucket_span
/internal/ml/validate/calculate_model_memory_limit
/internal/ml/validate/cardinality
/internal/ml/validate/job
/internal/ml/validate/datafeed_preview
/internal/ml/json_schema
/internal/ml/management/list/{listType}
/internal/ml/model_management/nodes_overview
/internal/ml/model_management/memory_usage
/internal/ml/modules/recognize/{indexPatternTitle}
/internal/ml/modules/get_module/{moduleId?}
/internal/ml/modules/setup/{moduleId}
/internal/ml/modules/jobs_exist/{moduleId}
/internal/ml/notifications
/internal/ml/notifications/count
/internal/ml/results/anomalies_table_data
/internal/ml/results/category_definition
/internal/ml/results/max_anomaly_score
/internal/ml/results/category_examples
/internal/ml/results/partition_fields_values
/internal/ml/results/anomaly_search
/internal/ml/results/{jobId}/categorizer_stats
/internal/ml/results/category_stopped_partitions
/internal/ml/results/datafeed_results_chart
/internal/ml/results/anomaly_charts
/internal/ml/results/anomaly_records
/internal/ml/saved_objects/status
/internal/ml/saved_objects/initialize
/internal/ml/saved_objects/sync_check
/internal/ml/saved_objects/update_jobs_spaces
/internal/ml/saved_objects/update_trained_models_spaces
/internal/ml/saved_objects/remove_item_from_current_space
/internal/ml/saved_objects/jobs_spaces
/internal/ml/saved_objects/trained_models_spaces
/internal/ml/saved_objects/can_delete_ml_space_aware_item/{jobType}
/internal/ml/_has_privileges
/internal/ml/ml_capabilities
/internal/ml/ml_node_count
/internal/ml/info
/internal/ml/es_search
/internal/ml/index_exists
/internal/ml/trained_models/{modelId?}
/internal/ml/trained_models/_stats
/internal/ml/trained_models/{modelId}/_stats
/internal/ml/trained_models/{modelId}/pipelines
/internal/ml/trained_models/{modelId}
/internal/ml/trained_models/{modelId}
/internal/ml/trained_models/{modelId}/deployment/_start
/internal/ml/trained_models/{modelId}/{deploymentId}/deployment/_update
/internal/ml/trained_models/{modelId}/{deploymentId}/deployment/_stop
/internal/ml/trained_models/pipeline_simulate
/internal/ml/trained_models/infer/{modelId}/{deploymentId}