Skip to content
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

[APM] Collect telemetry about data/API performance #51612

Merged
merged 3 commits into from
Mar 23, 2020

Conversation

dgieselaar
Copy link
Member

@dgieselaar dgieselaar commented Nov 25, 2019

Closes #50757.

An example of collected telemetry:

{
  "counts": {
    "error": {
      "1d": 162227,
      "all": 6809905
    },
    "metric": {
      "1d": 975978,
      "all": 48222846
    },
    "span": {
      "1d": 10592884,
      "all": 483896330
    },
    "transaction": {
      "1d": 1950203,
      "all": 92890244
    },
    "onboarding": {
      "1d": 0,
      "all": 7
    },
    "sourcemap": {
      "1d": 0,
      "all": 0
    },
    "agent_configuration": {
      "all": 3
    },
    "max_error_groups_per_service": {
      "1d": 1838
    },
    "max_transaction_groups_per_service": {
      "1d": 25
    },
    "traces": {
      "1d": 1483642
    },
    "services": {
      "1d": 8
    }
  },
  "retainment": {
    "error": {
      "ms": 4445241078
    },
    "metric": {
      "ms": 4445248747
    },
    "span": {
      "ms": 4445259937
    },
    "transaction": {
      "ms": 4445275561
    },
    "onboarding": {
      "ms": 4445288673
    }
  },
  "tasks": {
    "processor_events": {
      "took": {
        "ms": 32468
      }
    },
    "agent_configuration": {
      "took": {
        "ms": 19
      }
    },
    "services": {
      "took": {
        "ms": 3339
      }
    },
    "versions": {
      "took": {
        "ms": 102
      }
    },
    "groupings": {
      "took": {
        "ms": 3462
      }
    },
    "integrations": {
      "took": {
        "ms": 51
      }
    },
    "agents": {
      "took": {
        "ms": 12967
      }
    },
    "indices_stats": {
      "took": {
        "ms": 71
      }
    }
  },
  "has_any_services": true,
  "services_per_agent": {
    "java": 1,
    "js-base": 1,
    "rum-js": 0,
    "dotnet": 1,
    "go": 2,
    "nodejs": 1,
    "python": 1,
    "ruby": 1
  },
  "versions": {
    "apm_server": {
      "major": 8,
      "minor": 0,
      "patch": 0
    }
  },
  "integrations": {
    "ml": {
      "all_jobs_count": 1
    }
  },
  "agents": {
    "java": {
      "agent": {
        "version": [
          "1.13.1-SNAPSHOT"
        ]
      },
      "service": {
        "framework": {
          "name": [],
          "version": [],
          "composite": []
        },
        "language": {
          "name": [
            "Java"
          ],
          "version": [
            "10.0.2"
          ],
          "composite": [
            "Java/10.0.2"
          ]
        },
        "runtime": {
          "name": [
            "Java"
          ],
          "version": [
            "10.0.2"
          ],
          "composite": [
            "Java/10.0.2"
          ]
        }
      }
    },
    "js-base": {
      "agent": {
        "version": [
          "4.9.0"
        ]
      },
      "service": {
        "framework": {
          "name": [],
          "version": [],
          "composite": []
        },
        "language": {
          "name": [
            "javascript"
          ],
          "version": [],
          "composite": []
        },
        "runtime": {
          "name": [],
          "version": [],
          "composite": []
        }
      }
    },
    "rum-js": {
      "agent": {
        "version": []
      },
      "service": {
        "framework": {
          "name": [],
          "version": [],
          "composite": []
        },
        "language": {
          "name": [],
          "version": [],
          "composite": []
        },
        "runtime": {
          "name": [],
          "version": [],
          "composite": []
        }
      }
    },
    "dotnet": {
      "agent": {
        "version": [
          "1.3.1"
        ]
      },
      "service": {
        "framework": {
          "name": [
            "ASP.NET Core"
          ],
          "version": [
            "2.2.0.0"
          ],
          "composite": [
            "ASP.NET Core/2.2.0.0"
          ]
        },
        "language": {
          "name": [
            "C#"
          ],
          "version": [],
          "composite": []
        },
        "runtime": {
          "name": [
            ".NET Core"
          ],
          "version": [
            "2.2.8"
          ],
          "composite": [
            ".NET Core/2.2.8"
          ]
        }
      }
    },
    "go": {
      "agent": {
        "version": [
          "1.7.0",
          "1.7.1"
        ]
      },
      "service": {
        "framework": {
          "name": [
            "gin"
          ],
          "version": [
            "v1.4.0"
          ],
          "composite": [
            "gin/v1.4.0"
          ]
        },
        "language": {
          "name": [
            "go"
          ],
          "version": [
            "go1.13.8",
            "go1.14"
          ],
          "composite": [
            "go/go1.13.8",
            "go/go1.14"
          ]
        },
        "runtime": {
          "name": [
            "gc"
          ],
          "version": [
            "go1.13.8",
            "go1.14"
          ],
          "composite": [
            "gc/go1.13.8",
            "gc/go1.14"
          ]
        }
      }
    },
    "nodejs": {
      "agent": {
        "version": [
          "3.5.0"
        ]
      },
      "service": {
        "framework": {
          "name": [
            "express"
          ],
          "version": [
            "4.17.1"
          ],
          "composite": [
            "express/4.17.1"
          ]
        },
        "language": {
          "name": [
            "javascript"
          ],
          "version": [],
          "composite": []
        },
        "runtime": {
          "name": [
            "node"
          ],
          "version": [
            "12.16.1"
          ],
          "composite": [
            "node/12.16.1"
          ]
        }
      }
    },
    "python": {
      "agent": {
        "version": [
          "5.4.3"
        ]
      },
      "service": {
        "framework": {
          "name": [
            "django"
          ],
          "version": [
            "2.1.13"
          ],
          "composite": [
            "django/2.1.13"
          ]
        },
        "language": {
          "name": [
            "python"
          ],
          "version": [
            "3.6.10"
          ],
          "composite": [
            "python/3.6.10"
          ]
        },
        "runtime": {
          "name": [
            "CPython"
          ],
          "version": [
            "3.6.10"
          ],
          "composite": [
            "CPython/3.6.10"
          ]
        }
      }
    },
    "ruby": {
      "agent": {
        "version": [
          "3.5.0"
        ]
      },
      "service": {
        "framework": {
          "name": [
            "Ruby on Rails"
          ],
          "version": [
            "5.2.4.1"
          ],
          "composite": [
            "Ruby on Rails/5.2.4.1"
          ]
        },
        "language": {
          "name": [
            "ruby"
          ],
          "version": [
            "2.6.5"
          ],
          "composite": [
            "ruby/2.6.5"
          ]
        },
        "runtime": {
          "name": [
            "ruby"
          ],
          "version": [
            "2.6.5"
          ],
          "composite": [
            "ruby/2.6.5"
          ]
        }
      }
    }
  },
  "indices": {
    "shards": {
      "total": 24
    },
    "all": {
      "total": {
        "docs": {
          "count": 1135679324
        },
        "store": {
          "size_in_bytes": 570622947437
        }
      }
    }
  }
}

@elasticmachine
Copy link
Contributor

💔 Build Failed

@dgieselaar
Copy link
Member Author

dgieselaar commented Nov 27, 2019

Spoke to the telemetry folks, we should wrap this in a task that stores data to saved objects (similar to what we had), and we should investigate more aggressive pre-processing on our side (e.g., min/max/avg/percentiles)

@elasticmachine
Copy link
Contributor

💔 Build Failed

@elasticmachine
Copy link
Contributor

💔 Build Failed

@streamich streamich added Feature:Telemetry Team:APM All issues that need APM UI Team support labels Feb 7, 2020
@elasticmachine
Copy link
Contributor

Pinging @elastic/apm-ui (Team:apm)

@TinaHeiligers TinaHeiligers requested review from Bamieh and a team and removed request for Bamieh March 16, 2020 20:45
Copy link
Contributor

@TinaHeiligers TinaHeiligers left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm concerned over the current implementation, specifically about:

  1. writing directly to the xpack-phone-home index
  2. using a dynamic mapping for the apm data that's being overwritten in the xpack-phone-home index which is, on purpose, not mapped dynamically.
  3. At the moment, the xpack-home-phone template is updated when new mappings are added
  4. Adding yet another collector

I'd like some other members of the Pulse team to take a look before specifically approving/requesting changes and, while I realize the target is for 7.7, I hope you understand the concerns.

}
"apm-telemetry": {
"properties": {},
"dynamic": true
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dynamic mappings aren't set within the current telemetry service. The properties have to be defined explicitly.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I understand these mappings are for the SavedObjects. It should not cause any effect on the telemetry service. But it's true I think it's considered an antipattern the dynamic: true mappings in the SavedObjects as well (maybe the @elastic/kibana-platform team can confirm).
@dgieselaar mentioned it was dynamic only during the development phase. Just please don't forget to change this to the actual mapping when done :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for having dynamic:true was given in a Slack message:

...the dynamic mapping is temporary. Once the data that we are collecting is finalized I was planning on adding a static mapping

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The mapping for saved objects is no longer dynamic, thanks!

Copy link
Member

@afharo afharo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, it looks great! I only added some FYIs and nits.

The only main thing I'd personally don't do here is the upload-telemetry-data script. Unless there's a reason to have it I can't think of at the moment.

ruby: 'ruby',
go: 'go'
};
export type AgentName = typeof AGENT_NAMES[number];

export function isAgentName(agentName: string): boolean {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
export function isAgentName(agentName: string): boolean {
export function isAgentName(agentName: string): agentName is AgentName {

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻

);
export function isRumAgentName(
agentName: string | undefined
): agentName is AgentName {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
): agentName is AgentName {
): agentName is 'js-base' | 'rum-js' {

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙌🏻

Comment on lines 14 to 26
export const AGENT_NAMES = [
'java',
'js-base',
'rum-js',
'dotnet',
'go',
'java',
'nodejs',
'python',
'ruby'
] as const;

const agentNames: { [agentName in AgentName]: agentName } = {
python: 'python',
java: 'java',
nodejs: 'nodejs',
'js-base': 'js-base',
'rum-js': 'rum-js',
dotnet: 'dotnet',
ruby: 'ruby',
go: 'go'
};
export type AgentName = typeof AGENT_NAMES[number];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️

}
"apm-telemetry": {
"properties": {},
"dynamic": true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I understand these mappings are for the SavedObjects. It should not cause any effect on the telemetry service. But it's true I think it's considered an antipattern the dynamic: true mappings in the SavedObjects as well (maybe the @elastic/kibana-platform team can confirm).
@dgieselaar mentioned it was dynamic only during the development phase. Just please don't forget to change this to the actual mapping when done :)

bool: {
filter: [{ range: { '@timestamp': { gte: 'now-30d' } } }]
}
},
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

size: 0?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see other reply

taskManager.ensureScheduled({
id: APM_TELEMETRY_TASK_NAME,
taskType: APM_TELEMETRY_TASK_NAME,
interval: '1m',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love this taskManager approach to get all the stats ready to consume from the savedObject at any point when the usage collector requires it.

Especially taking into account all the requests we do to retrieve this telemetry. That's a good amount of information! Well done! 👏

Just FYI, we usually report telemetry every 24h so, maybe running the collection logic every minute is a bit too much? ;)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed this to 24h - another artifact of "dev mode" 😅

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, let me know if it should be anything else than 24h

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed it to 720m (12 hours, the task manager only supports seconds and minutes)

}
APM_TELEMETRY_SAVED_OBJECT_TYPE,
dataTelemetry,
{ id: APM_TELEMETRY_SAVED_OBJECT_TYPE, overwrite: true }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a risk we might delete existing telemetry because of

} catch (err) {
logger.warn(`Failed executing APM telemetry task ${task.name}`);
logger.info(err);
return data;
}

But the chances should be low so I wouldn't worry too much about it (just a heads up) ;)

Comment on lines 19 to 95
export type APMDataTelemetry = DeepPartial<{
has_any_services: boolean;
services_per_agent: Record<AgentName, number>;
versions: {
apm_server: {
minor: number;
major: number;
patch: number;
};
};
counts: {
transaction: TimeframeMap;
span: TimeframeMap;
error: TimeframeMap;
metric: TimeframeMap;
sourcemap: TimeframeMap;
onboarding: TimeframeMap;
agent_configuration: TimeframeAll;
max_transaction_groups_per_service: TimeframeAll;
max_error_groups_per_service: TimeframeAll;
traces: TimeframeAll;
services: TimeframeAll;
};
integrations: {
ml: {
has_anomalies_indices: boolean;
};
};
agents: Record<
AgentName,
{
agent: {
version: string[];
};
service: {
framework: {
name: string[];
version: string[];
};
language: {
name: string[];
version: string[];
};
runtime: {
name: string[];
version: string[];
};
};
}
>;
indices: {
shards: {
total: number;
};
all: {
total: {
docs: {
count: number;
};
store: {
size_in_bytes: number;
};
};
};
};
tasks: Record<
| 'processor_events'
| 'agent_configuration'
| 'services'
| 'versions'
| 'groupings'
| 'integrations'
| 'agents'
| 'indices_stats',
{ took: { ms: number } }
>;
}>;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's amazing to have this! This will help us much to create the mapping in the telemetry cluster! Thanks for being so thoughtful and strict with the types! ❤️

"apm_oss",
"data",
"home",
"usageCollection"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done, thanks!

@TinaHeiligers
Copy link
Contributor

Overall, it looks great! I only added some FYIs and nits.

The only main thing I'd personally don't do here is the upload-telemetry-data script. Unless there's a reason to have it I can't think of at the moment.

From a Slack message:

...script that collects data and writes it to a specified index, but that’s just for testing purposes

@dgieselaar dgieselaar force-pushed the apm-data-telemetry branch 4 times, most recently from 5b0c188 to 2197df8 Compare March 18, 2020 19:43
@dgieselaar dgieselaar marked this pull request as ready for review March 18, 2020 20:44
@dgieselaar dgieselaar requested a review from a team as a code owner March 18, 2020 20:44
Copy link
Member

@afharo afharo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@@ -1,42 +1,734 @@
{
"apm-services-telemetry": {
"apm-telemetry": {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you! this is so awesome will be so useful when we add the mapping in the telemetry cluster. Please refer to this file when requesting it :)

},
"java": {
"type": "long",
"null_value": 0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if the removal of the "null_value" might cause any issues?

Feel free to dismiss this if this change is intended :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch - I don't think we need a fallback anymore but I'll put it there to prevent any backwards compat issues.

Copy link
Member

@sorenlouv sorenlouv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm 👍

*/

// compile typescript on the fly
// eslint-disable-next-line import/no-extraneous-dependencies
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a description to this script about what it does

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aye, I could do it in this file, in dev_docs or in a README.md file in this folder, any preferences?

...(githubToken
? {
auth: githubToken
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is githubToken not required? If the repo is private I'd expect this to require a token.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I'll just fail the process in that case. Can't remember why I made it optional.

Comment on lines 42 to 58
...(yaml.safeLoad(
fs.readFileSync(
fs.existsSync(kibanaDevConfig) ? kibanaDevConfig : kibanaConfig,
'utf8'
)
) as {}),
...(pick(
{
'elasticsearch.username': process.env.ELASTICSEARCH_USERNAME,
'elasticsearch.password': process.env.ELASTICSEARCH_PASSWORD,
'elasticsearch.hosts': process.env.ELASTICSEARCH_HOST
},
identity
) as {
'elasticsearch.username': string;
'elasticsearch.password': string;
})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be cleaner with safeLoad done separately?
Also: shouldn't elasticsearch.hosts be in the explicit type?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll split it up a bit. elasticsearch.hosts is already in the type because it has a default value, but it doesn't hurt to have it in both, I'll add it there as well (it looks odd).

'nodejs',
'python',
'ruby'
];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorting <3

@@ -7,7 +7,13 @@
export const SERVICE_NAME = 'service.name';
export const SERVICE_ENVIRONMENT = 'service.environment';
export const SERVICE_AGENT_NAME = 'agent.name';
export const SERVICE_AGENT_VERSION = 'agent.version';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think SERVICE_AGENT_NAME and SERVICE_AGENT_VERSION should be called AGENT_NAME and AGENT_VERSION since they are no longer on the "service" context (they used to be afair)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah yeah was wondering why that was the case. I'll update

}
) {
const logger = this.initContext.logger.get('apm');
const logger = this.initContext.logger.get();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why no longer in the context of 'apm'?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's already scoped, so scoping it again leads to [apm] [apm] output

@dgieselaar dgieselaar force-pushed the apm-data-telemetry branch 3 times, most recently from 642543f to cd8d753 Compare March 20, 2020 15:00
serviceMapEnabled: Joi.boolean().default(true),

// telemetry
telemetryCollectionEnabled: Joi.boolean().default(true)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we want a specific flag to disable APM-only telemetry (while the rest of the telemetry is enabled)? Wouldn't that complicate the analysis about the usage? aka: how can I tell APM is used but not reporting telemetry because it's disabled?
We could do that by checking the application_usage.apm stats... but I'd like @alexfrancoeur thoughts on this.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be great to get some additional feedback 👍🏻the reason why I've added it because we want an escape hatch in case the queries are too expensive, without requiring our users to disable telemetry altogether in those cases.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@afharo If you don't mind, I'll merge this in given the time constraints, but let me know if there's anything we need to change.

@kibanamachine
Copy link
Contributor

💚 Build Succeeded

History

To update your PR or re-run it, just comment with:
@elasticmachine merge upstream

Copy link
Contributor

@spalger spalger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yarn.lock config changes LGTM

@dgieselaar dgieselaar merged commit 13baa51 into elastic:master Mar 23, 2020
@dgieselaar dgieselaar deleted the apm-data-telemetry branch March 23, 2020 22:08
spalger added a commit that referenced this pull request Mar 24, 2020
@spalger
Copy link
Contributor

spalger commented Mar 24, 2020

This was causing type check failures in master once it was merged so it was reverted in 6de7f2a

@spalger spalger added the backport:skip This commit does not require backporting label Mar 24, 2020
dgieselaar added a commit to dgieselaar/kibana that referenced this pull request Mar 24, 2020
gmmorris added a commit to gmmorris/kibana that referenced this pull request Mar 24, 2020
* master: (34 commits)
  [APM] add service map config options to legacy plugin (elastic#61002)
  [App Arch] migrate legacy CSS to new platform (core_plugins/kibana_react) (elastic#59882)
  Migrated styles for "share" plugin to new platform (elastic#59981)
  [ML] Module setup with dynamic model memory estimation (elastic#60656)
  Drilldowns (elastic#59632)
  Upgrade mocha dev-dependency from 6.2.2 to 7.1.1 (elastic#60779)
  [SIEM] Overview: Recent cases widget (elastic#60993)
  [ML] Functional tests - stabilize df analytics clone tests (elastic#60497)
  [SIEM] Updates process and TLS tables to use ECS 1.5 fields (elastic#60854)
  Migrate doc view part of discover (elastic#58094)
  Revert "[APM] Collect telemetry about data/API performance (elastic#51612)"
  fix(NA): log rotation watchers usage (elastic#60956)
  [SIEM] [CASES] Build lego blocks case details view (elastic#60864)
  Create Painless Lab app (elastic#57538)
  [SIEM] Move Timeline Template field to first step of rule creation (elastic#60840)
  [Reporting/New Platform Migration] Use a new config service on server-side (elastic#55882)
  [Alerting] allow email action to not require auth (elastic#60839)
  [Maps] Default ES document layer scaling type to clusters and show scaling UI in the create wizard (elastic#60668)
  [APM] Collect telemetry about data/API performance (elastic#51612)
  Implement Kibana Login Selector (elastic#53010)
  ...
dgieselaar added a commit to dgieselaar/kibana that referenced this pull request Mar 24, 2020
dgieselaar added a commit to dgieselaar/kibana that referenced this pull request Mar 24, 2020
dgieselaar added a commit that referenced this pull request Mar 24, 2020
* Revert "Revert "[APM] Collect telemetry about data/API performance (#51612)""

This reverts commit 6de7f2a.

* Update transaction mock data to reflect the type
dgieselaar added a commit to dgieselaar/kibana that referenced this pull request Mar 24, 2020
…ic#61030)

* Revert "Revert "[APM] Collect telemetry about data/API performance (elastic#51612)""

This reverts commit 6de7f2a.

* Update transaction mock data to reflect the type
dgieselaar added a commit that referenced this pull request Mar 24, 2020
* Revert "Revert "[APM] Collect telemetry about data/API performance (#51612)""

This reverts commit 6de7f2a.

* Update transaction mock data to reflect the type
@ogupte ogupte self-assigned this Apr 5, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport:skip This commit does not require backporting Feature:Telemetry release_note:enhancement reverted Team:APM All issues that need APM UI Team support v7.7.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[APM] Collect telemetry about data/queries
10 participants