Remove Geckoview Streaming helper code
This is not in use anymore. Last use removed in https://bugzilla.mozilla.org/show_bug.cgi?id=1877836 We don't remove support for _parsing_ `gecko_datapoint` to stay compatible with already existing old definition files.
This commit is contained in:
Родитель
98fbc269f4
Коммит
6e109c8fbf
|
@ -3,6 +3,7 @@
|
|||
## Unreleased
|
||||
|
||||
- **Breaking change:** Updating Kotlin template import statement as part of removing `service-glean` from Android Components. ([bug 1906941](https://bugzilla.mozilla.org/show_bug.cgi?id=1906941))
|
||||
- **Breaking change:** Do not generate Geckoview Streaming helper code ([#743](https://github.com/mozilla/glean_parser/pull/743))
|
||||
|
||||
## 14.5.2
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
Outputter to generate Kotlin code for metrics.
|
||||
"""
|
||||
|
||||
from collections import OrderedDict
|
||||
import enum
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
@ -17,9 +16,7 @@ from typing import Any, Dict, List, Optional, Union # noqa
|
|||
from . import __version__
|
||||
from . import metrics
|
||||
from . import pings
|
||||
from . import tags
|
||||
from . import util
|
||||
from .util import DictWrapper
|
||||
|
||||
|
||||
def kotlin_datatypes_filter(value: util.JSONType) -> str:
|
||||
|
@ -179,105 +176,6 @@ def generate_build_date(date: Optional[str]) -> str:
|
|||
return f'Calendar.getInstance(TimeZone.getTimeZone("GMT+0")).also {{ cal -> cal.set({components}) }}' # noqa
|
||||
|
||||
|
||||
def output_gecko_lookup(
|
||||
objs: metrics.ObjectTree, output_dir: Path, options: Optional[Dict[str, Any]] = None
|
||||
) -> None:
|
||||
"""
|
||||
Given a tree of objects, generate a Kotlin map between Gecko histograms and
|
||||
Glean SDK metric types.
|
||||
|
||||
:param objects: A tree of objects (metrics and pings) as returned from
|
||||
`parser.parse_objects`.
|
||||
:param output_dir: Path to an output directory to write to.
|
||||
:param options: options dictionary, with the following optional keys:
|
||||
|
||||
- `namespace`: The package namespace to declare at the top of the
|
||||
generated files. Defaults to `GleanMetrics`.
|
||||
- `glean_namespace`: The package namespace of the glean library itself.
|
||||
This is where glean objects will be imported from in the generated
|
||||
code.
|
||||
"""
|
||||
if options is None:
|
||||
options = {}
|
||||
|
||||
template = util.get_jinja2_template(
|
||||
"kotlin.geckoview.jinja2",
|
||||
filters=(
|
||||
("kotlin", kotlin_datatypes_filter),
|
||||
("type_name", type_name),
|
||||
("class_name", class_name),
|
||||
),
|
||||
)
|
||||
|
||||
namespace = options.get("namespace", "GleanMetrics")
|
||||
glean_namespace = options.get("glean_namespace", "mozilla.components.service.glean")
|
||||
|
||||
# Build a dictionary that contains data for metrics that are
|
||||
# histogram-like/scalar-like and contain a gecko_datapoint, with this format:
|
||||
#
|
||||
# {
|
||||
# "histograms": {
|
||||
# "category": [
|
||||
# {"gecko_datapoint": "the-datapoint", "name": "the-metric-name"},
|
||||
# ...
|
||||
# ],
|
||||
# ...
|
||||
# },
|
||||
# "other-type": {}
|
||||
# }
|
||||
gecko_metrics: Dict[str, Dict[str, List[Dict[str, str]]]] = DictWrapper()
|
||||
|
||||
# Define scalar-like types.
|
||||
SCALAR_LIKE_TYPES = ["boolean", "string", "quantity"]
|
||||
|
||||
for category_key, category_val in objs.items():
|
||||
# Support exfiltration of Gecko metrics from products using both the
|
||||
# Glean SDK and GeckoView. See bug 1566356 for more context.
|
||||
for metric in category_val.values():
|
||||
# This is not a Gecko metric, skip it.
|
||||
if (
|
||||
isinstance(metric, pings.Ping)
|
||||
or isinstance(metric, tags.Tag)
|
||||
or not getattr(metric, "gecko_datapoint", False)
|
||||
):
|
||||
continue
|
||||
|
||||
# Put scalars in their own categories, histogram-like in "histograms" and
|
||||
# categorical histograms in "categoricals".
|
||||
type_category = "histograms"
|
||||
if metric.type in SCALAR_LIKE_TYPES:
|
||||
type_category = metric.type
|
||||
elif metric.type == "labeled_counter":
|
||||
# Labeled counters with a 'gecko_datapoint' property
|
||||
# are categorical histograms.
|
||||
type_category = "categoricals"
|
||||
|
||||
gecko_metrics.setdefault(type_category, OrderedDict())
|
||||
gecko_metrics[type_category].setdefault(category_key, [])
|
||||
|
||||
gecko_metrics[type_category][category_key].append(
|
||||
{"gecko_datapoint": metric.gecko_datapoint, "name": metric.name}
|
||||
)
|
||||
|
||||
if not gecko_metrics:
|
||||
# Bail out and don't create a file if no gecko metrics
|
||||
# are found.
|
||||
return
|
||||
|
||||
filepath = output_dir / "GleanGeckoMetricsMapping.kt"
|
||||
with filepath.open("w", encoding="utf-8") as fd:
|
||||
fd.write(
|
||||
template.render(
|
||||
parser_version=__version__,
|
||||
gecko_metrics=gecko_metrics,
|
||||
namespace=namespace,
|
||||
glean_namespace=glean_namespace,
|
||||
)
|
||||
)
|
||||
# Jinja2 squashes the final newline, so we explicitly add it
|
||||
fd.write("\n")
|
||||
|
||||
|
||||
def output_kotlin(
|
||||
objs: metrics.ObjectTree, output_dir: Path, options: Optional[Dict[str, Any]] = None
|
||||
) -> None:
|
||||
|
@ -376,6 +274,3 @@ def output_kotlin(
|
|||
)
|
||||
# Jinja2 squashes the final newline, so we explicitly add it
|
||||
fd.write("\n")
|
||||
|
||||
# TODO: Maybe this should just be a separate outputter?
|
||||
output_gecko_lookup(objs, output_dir, options)
|
||||
|
|
|
@ -1,124 +0,0 @@
|
|||
// -*- mode: kotlin -*-
|
||||
|
||||
/*
|
||||
* AUTOGENERATED BY glean_parser v{{ parser_version }}. DO NOT EDIT. DO NOT COMMIT.
|
||||
*/
|
||||
{# The rendered markdown is autogenerated, but this
|
||||
Jinja2 template is not. Please file bugs! #}
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
@file:Suppress("PackageNaming", "MaxLineLength")
|
||||
package {{ namespace }}
|
||||
|
||||
import {{ glean_namespace }}.private.BooleanMetricType // ktlint-disable import-ordering no-unused-imports
|
||||
import {{ glean_namespace }}.private.CounterMetricType // ktlint-disable import-ordering no-unused-imports
|
||||
import {{ glean_namespace }}.private.HistogramBase // ktlint-disable import-ordering no-unused-imports
|
||||
import {{ glean_namespace }}.private.LabeledMetricType // ktlint-disable import-ordering no-unused-imports
|
||||
import {{ glean_namespace }}.private.QuantityMetricType // ktlint-disable import-ordering no-unused-imports
|
||||
import {{ glean_namespace }}.private.StringMetricType // ktlint-disable import-ordering no-unused-imports
|
||||
|
||||
/*
|
||||
* This class performs the mapping between Gecko metrics and Glean SDK
|
||||
* metric types.
|
||||
*/
|
||||
internal object GleanGeckoMetricsMapping {
|
||||
// Support exfiltration of Gecko histograms from products using both the
|
||||
// Glean SDK and GeckoView. See bug 1566356 for more context.
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun getHistogram(geckoMetricName: String): HistogramBase? {
|
||||
{% if 'histograms' in gecko_metrics %}
|
||||
return when (geckoMetricName) {
|
||||
{% for category in gecko_metrics['histograms'].keys()|sort %}
|
||||
// From {{ category|Camelize }}.kt
|
||||
{% for metric in gecko_metrics['histograms'][category] %}
|
||||
"{{ metric.gecko_datapoint }}" -> {{ category|Camelize }}.{{ metric.name|camelize }}
|
||||
{% endfor %}
|
||||
{%- endfor %}
|
||||
else -> null
|
||||
}
|
||||
{% else %}
|
||||
return null
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
// Support exfiltration of Gecko categorical histograms from products using
|
||||
// both the Glean SDK and GeckoView. See bug 1571740 for more context.
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun getCategoricalMetric(
|
||||
geckoMetricName: String
|
||||
): LabeledMetricType<CounterMetricType>? {
|
||||
{% if 'categoricals' in gecko_metrics %}
|
||||
return when (geckoMetricName) {
|
||||
{% for category in gecko_metrics['categoricals'].keys()|sort %}
|
||||
// From {{ category|Camelize }}.kt
|
||||
{% for metric in gecko_metrics['categoricals'][category] %}
|
||||
"{{ metric.gecko_datapoint }}" -> {{ category|Camelize }}.{{ metric.name|camelize }}
|
||||
{% endfor %}
|
||||
{%- endfor %}
|
||||
else -> null
|
||||
}
|
||||
{% else %}
|
||||
return null
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
// Support exfiltration of Gecko boolean scalars from products using both the
|
||||
// Glean SDK and GeckoView. See bug 1579365 for more context.
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun getBooleanScalar(geckoMetricName: String): BooleanMetricType? {
|
||||
{% if 'boolean' in gecko_metrics %}
|
||||
return when (geckoMetricName) {
|
||||
{% for category in gecko_metrics['boolean'].keys()|sort %}
|
||||
// From {{ category|Camelize }}.kt
|
||||
{% for metric in gecko_metrics['boolean'][category] %}
|
||||
"{{ metric.gecko_datapoint }}" -> {{ category|Camelize }}.{{ metric.name|camelize }}
|
||||
{% endfor %}
|
||||
{%- endfor %}
|
||||
else -> null
|
||||
}
|
||||
{% else %}
|
||||
return null
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
// Support exfiltration of Gecko string scalars from products using both the
|
||||
// Glean SDK and GeckoView. See bug 1579365 for more context.
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun getStringScalar(geckoMetricName: String): StringMetricType? {
|
||||
{% if 'string' in gecko_metrics %}
|
||||
return when (geckoMetricName) {
|
||||
{% for category in gecko_metrics['string'].keys()|sort %}
|
||||
// From {{ category|Camelize }}.kt
|
||||
{% for metric in gecko_metrics['string'][category] %}
|
||||
"{{ metric.gecko_datapoint }}" -> {{ category|Camelize }}.{{ metric.name|camelize }}
|
||||
{% endfor %}
|
||||
{%- endfor %}
|
||||
else -> null
|
||||
}
|
||||
{% else %}
|
||||
return null
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
// Support exfiltration of Gecko quantity scalars from products using both the
|
||||
// Glean SDK and GeckoView. See bug 1579365 for more context.
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun getQuantityScalar(geckoMetricName: String): QuantityMetricType? {
|
||||
{% if 'quantity' in gecko_metrics %}
|
||||
return when (geckoMetricName) {
|
||||
{% for category in gecko_metrics['quantity'].keys()|sort %}
|
||||
// From {{ category|Camelize }}.kt
|
||||
{% for metric in gecko_metrics['quantity'][category] %}
|
||||
"{{ metric.gecko_datapoint }}" -> {{ category|Camelize }}.{{ metric.name|camelize }}
|
||||
{% endfor %}
|
||||
{%- endfor %}
|
||||
else -> null
|
||||
}
|
||||
{% else %}
|
||||
return null
|
||||
{% endif %}
|
||||
}
|
||||
}
|
|
@ -1,133 +0,0 @@
|
|||
# Any copyright is dedicated to the Public Domain.
|
||||
# https://creativecommons.org/publicdomain/zero/1.0/
|
||||
|
||||
---
|
||||
$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0
|
||||
|
||||
page.perf:
|
||||
load_time:
|
||||
type: timing_distribution
|
||||
gecko_datapoint: GV_PAGE_LOAD_MS
|
||||
time_unit: millisecond
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample timing distribution metric exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11566356
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
|
||||
reload_time:
|
||||
type: timing_distribution
|
||||
gecko_datapoint: GV_PAGE_RELOAD_MS
|
||||
time_unit: millisecond
|
||||
lifetime: application
|
||||
description: >
|
||||
Another sample timing distribution metric exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11566356
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
|
||||
dom_script_preload:
|
||||
type: labeled_counter
|
||||
gecko_datapoint: DOM_SCRIPT_PRELOAD_RESULT
|
||||
labels:
|
||||
- used
|
||||
- rejected_by_policy
|
||||
- request_mismatch
|
||||
- load_error
|
||||
- not_used
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample categorical metric exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11571740
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
no_lint:
|
||||
- TYPE_IN_NAME
|
||||
|
||||
gfx.content.checkerboard:
|
||||
duration:
|
||||
type: timing_distribution
|
||||
gecko_datapoint: CHECKERBOARD_DURATION
|
||||
time_unit: millisecond
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample timing distribution metric exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11566356
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
|
||||
gfx.info.adapter:
|
||||
vendor_id:
|
||||
type: string
|
||||
gecko_datapoint: gfx_adapter.vendor_id
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample string metric. It's a string scalar exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11579365
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
|
||||
stand_alone:
|
||||
type: boolean
|
||||
gecko_datapoint: gfx_adapter.stand_alone
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample boolean metric. It's a boolean scalar exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11579365
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
|
||||
screen_width:
|
||||
type: quantity
|
||||
gecko_datapoint: gfx_adapter.width
|
||||
unit: pixel
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample quantity metric. It's a uint scalar exported from Gecko.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11579365
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
||||
|
||||
non.gecko.metrics:
|
||||
app_load_time:
|
||||
type: timing_distribution
|
||||
time_unit: millisecond
|
||||
lifetime: application
|
||||
description: >
|
||||
A sample timing distribution that is not tied to a Gecko datapoint.
|
||||
bugs:
|
||||
- https://bugzilla.mozilla.org/11566356
|
||||
data_reviews:
|
||||
- http://example.com/reviews
|
||||
notification_emails:
|
||||
- CHANGE-ME@example.com
|
||||
expires: 2100-01-01
|
|
@ -249,100 +249,6 @@ def test_glean_namespace(tmp_path):
|
|||
assert content.count("import Bar.private.CounterMetricType") == 1
|
||||
|
||||
|
||||
def test_gecko_datapoints(tmp_path):
|
||||
"""Test translating metrics to Kotlin files."""
|
||||
translate.translate(
|
||||
ROOT / "data" / "gecko.yaml",
|
||||
"kotlin",
|
||||
tmp_path,
|
||||
{"glean_namespace": "Bar"},
|
||||
{"allow_reserved": True},
|
||||
)
|
||||
|
||||
metrics_files = [
|
||||
"GfxContentCheckerboard.kt",
|
||||
"GfxInfoAdapter.kt",
|
||||
"PagePerf.kt",
|
||||
"NonGeckoMetrics.kt",
|
||||
"GleanBuildInfo.kt",
|
||||
]
|
||||
assert set(x.name for x in tmp_path.iterdir()) == set(
|
||||
["GleanGeckoMetricsMapping.kt"] + metrics_files
|
||||
)
|
||||
|
||||
# Make sure descriptions made it in
|
||||
with (tmp_path / "GleanGeckoMetricsMapping.kt").open("r", encoding="utf-8") as fd:
|
||||
content = fd.read()
|
||||
# Make sure we're adding the relevant Glean SDK import, once.
|
||||
assert content.count("import Bar.private.HistogramBase") == 1
|
||||
|
||||
# Validate the generated Gecko metric mapper Kotlin functions.
|
||||
# NOTE: Indentation, whitespaces and text formatting of the block
|
||||
# below are important. Do not change them unless the file format
|
||||
# changes, otherwise validation will fail.
|
||||
expected_func = """ fun getHistogram(geckoMetricName: String): HistogramBase? {
|
||||
return when (geckoMetricName) {
|
||||
// From GfxContentCheckerboard.kt
|
||||
"CHECKERBOARD_DURATION" -> GfxContentCheckerboard.duration
|
||||
// From PagePerf.kt
|
||||
"GV_PAGE_LOAD_MS" -> PagePerf.loadTime
|
||||
"GV_PAGE_RELOAD_MS" -> PagePerf.reloadTime
|
||||
else -> null
|
||||
}
|
||||
}""" # noqa
|
||||
|
||||
assert expected_func in content
|
||||
|
||||
expected_func = """ fun getCategoricalMetric(
|
||||
geckoMetricName: String
|
||||
): LabeledMetricType<CounterMetricType>? {
|
||||
return when (geckoMetricName) {
|
||||
// From PagePerf.kt
|
||||
"DOM_SCRIPT_PRELOAD_RESULT" -> PagePerf.domScriptPreload
|
||||
else -> null
|
||||
}
|
||||
}"""
|
||||
|
||||
assert expected_func in content
|
||||
|
||||
expected_func = """ fun getBooleanScalar(geckoMetricName: String): BooleanMetricType? {
|
||||
return when (geckoMetricName) {
|
||||
// From GfxInfoAdapter.kt
|
||||
"gfx_adapter.stand_alone" -> GfxInfoAdapter.standAlone
|
||||
else -> null
|
||||
}
|
||||
}""" # noqa
|
||||
|
||||
assert expected_func in content
|
||||
|
||||
expected_func = """ fun getStringScalar(geckoMetricName: String): StringMetricType? {
|
||||
return when (geckoMetricName) {
|
||||
// From GfxInfoAdapter.kt
|
||||
"gfx_adapter.vendor_id" -> GfxInfoAdapter.vendorId
|
||||
else -> null
|
||||
}
|
||||
}""" # noqa
|
||||
|
||||
assert expected_func in content
|
||||
|
||||
expected_func = """ fun getQuantityScalar(geckoMetricName: String): QuantityMetricType? {
|
||||
return when (geckoMetricName) {
|
||||
// From GfxInfoAdapter.kt
|
||||
"gfx_adapter.width" -> GfxInfoAdapter.screenWidth
|
||||
else -> null
|
||||
}
|
||||
}""" # noqa
|
||||
|
||||
assert expected_func in content
|
||||
|
||||
for file_name in metrics_files:
|
||||
with (tmp_path / file_name).open("r", encoding="utf-8") as fd:
|
||||
content = fd.read()
|
||||
assert "HistogramBase" not in content
|
||||
|
||||
run_linters(tmp_path.glob("*.kt"))
|
||||
|
||||
|
||||
def test_event_extra_keys_in_correct_order(tmp_path):
|
||||
"""
|
||||
Assert that the extra keys appear in the parameter and the enumeration in
|
||||
|
|
Загрузка…
Ссылка в новой задаче