diff --git a/src/plugins/profiling/public/app.tsx b/src/plugins/profiling/public/app.tsx index 7aace0a4cd7f93..62ea6e44e26b63 100644 --- a/src/plugins/profiling/public/app.tsx +++ b/src/plugins/profiling/public/app.tsx @@ -33,7 +33,7 @@ import { Services } from './services'; type Props = Services; -function App({ fetchTopN, fetchElasticFlamechart, fetchPixiFlamechart }: Props) { +function App({ fetchTopN, fetchElasticFlamechart, fetchPixiFlamechart, fetchTopNData }: Props) { const [topn, setTopN] = useState({ samples: [], series: new Map(), diff --git a/src/plugins/profiling/public/plugin.tsx b/src/plugins/profiling/public/plugin.tsx index 2d828ebb612500..a314488e8d860e 100644 --- a/src/plugins/profiling/public/plugin.tsx +++ b/src/plugins/profiling/public/plugin.tsx @@ -6,18 +6,29 @@ * Side Public License, v 1. */ -import { AppMountParameters, CoreSetup, CoreStart, Plugin } from '../../../core/public'; +import { AppMountParameters, CoreSetup, CoreStart, Plugin } from 'kibana/public'; import { getServices } from './services'; +import { DataPublicPluginSetup, DataPublicPluginStart } from '../../data/public'; -export class ProdfilerPlugin implements Plugin { - public setup(core: CoreSetup) { +export interface ProdfilerPluginStartDeps { + data: DataPublicPluginStart; +} + +export interface ProdfilerPluginSetupDeps { + data: DataPublicPluginSetup; +} + +export class ProdfilerPlugin + implements Plugin +{ + public setup(core: CoreSetup) { // Register an application into the side navigation menu core.application.register({ id: 'prodfiler', title: 'Prodfiler', async mount({ element }: AppMountParameters) { - const [coreStart] = await core.getStartServices(); - const startServices = getServices(coreStart); + const [coreStart, dataPlugin] = await core.getStartServices(); + const startServices = getServices(coreStart, dataPlugin); const { renderApp } = await import('./app'); return renderApp(startServices, element); }, diff --git a/src/plugins/profiling/public/services.ts b/src/plugins/profiling/public/services.ts index 31911d6b6451b0..97c1536d531ddc 100644 --- a/src/plugins/profiling/public/services.ts +++ b/src/plugins/profiling/public/services.ts @@ -8,11 +8,15 @@ import { CoreStart, HttpFetchError, HttpFetchQuery } from 'kibana/public'; import { getRemoteRoutePaths } from '../common'; +import { ProdfilerPluginStartDeps } from './plugin'; +import { DownsampledRequest, DownsampledTopNResponse } from '../common/types'; export interface Services { fetchTopN: (type: string, seconds: string) => Promise; fetchElasticFlamechart: (seconds: string) => Promise; fetchPixiFlamechart: (seconds: string) => Promise; + // FIXME + fetchTopNData?: (searchField: string, seconds: string) => Promise; } function getFetchQuery(seconds: string): HttpFetchQuery { @@ -27,11 +31,35 @@ function getFetchQuery(seconds: string): HttpFetchQuery { } as HttpFetchQuery; } -export function getServices(core: CoreStart): Services { +export function getServices(core: CoreStart, data?: ProdfilerPluginStartDeps): Services { // To use local fixtures instead, use getLocalRoutePaths const paths = getRemoteRoutePaths(); return { + fetchTopNData: (searchField: string, seconds: string): Promise => { + const unixTime = Math.floor(Date.now() / 1000); + return ( + data!.data.search + .search( + { + params: { + projectID: 5, + timeFrom: unixTime - parseInt(seconds, 10), + timeTo: unixTime, + // FIXME remove hard-coded value for topN items length and expose it through the UI + topNItems: 100, + searchField, + }, + }, + { + strategy: 'downsampledTopN', + } + ) + // get the results and prepare the Promise + .toPromise() + ); + }, + fetchTopN: async (type: string, seconds: string) => { try { const query = getFetchQuery(seconds);