blob: 10da09b4fd2c4ff7efb40fdf36f40f5ba0f3dc71 [file] [log] [blame]
# Copyright (C) 2022 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the 'License');
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an 'AS IS' BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Contains metadata tables for a wide range of usecases."""
from python.generators.trace_processor_table.public import Alias
from python.generators.trace_processor_table.public import Column as C
from python.generators.trace_processor_table.public import ColumnDoc
from python.generators.trace_processor_table.public import ColumnFlag
from python.generators.trace_processor_table.public import CppDouble
from python.generators.trace_processor_table.public import CppInt64
from python.generators.trace_processor_table.public import CppOptional
from python.generators.trace_processor_table.public import CppString
from python.generators.trace_processor_table.public import Table
from python.generators.trace_processor_table.public import TableDoc
from python.generators.trace_processor_table.public import CppTableId
from python.generators.trace_processor_table.public import CppUint32
from python.generators.trace_processor_table.public import CppSelfTableId
from python.generators.trace_processor_table.public import WrappingSqlView
MACHINE_TABLE = Table(
python_module=__file__,
class_name='MachineTable',
sql_name='machine',
columns=[
C('raw_id', CppUint32()),
],
tabledoc=TableDoc(
doc='''
Contains raw machine_id of trace packets emitted from remote machines.
''',
group='Metadata',
columns={
'raw_id':
'''
Raw machine identifier in the trace packet, non-zero for
remote machines.
'''
}))
PROCESS_TABLE = Table(
python_module=__file__,
class_name='ProcessTable',
sql_name='__intrinsic_process',
columns=[
C('upid', Alias(underlying_column='id')),
C('pid', CppUint32()),
C('name', CppOptional(CppString())),
C('start_ts', CppOptional(CppInt64())),
C('end_ts', CppOptional(CppInt64())),
C('parent_upid', CppOptional(CppSelfTableId())),
C('uid', CppOptional(CppUint32())),
C('android_appid', CppOptional(CppUint32())),
C('cmdline', CppOptional(CppString())),
C('arg_set_id', CppUint32()),
C('machine_id', CppOptional(CppTableId(MACHINE_TABLE))),
],
wrapping_sql_view=WrappingSqlView(view_name='process',),
tabledoc=TableDoc(
doc='Contains information of processes seen during the trace',
group='Metadata',
skip_id_and_type=True,
columns={
'upid':
'''
Unique process id. This is != the OS pid. This is a
monotonic number associated to each process. The OS process
id (pid) cannot be used as primary key because tids and pids
are recycled by most kernels.
''',
'pid':
'''
The OS id for this process. Note: this is *not* unique
over the lifetime of the trace so cannot be used as a
primary key. Use |upid| instead.
''',
'name':
'''
The name of the process. Can be populated from many sources
(e.g. ftrace, /proc scraping, track event etc).
''',
'start_ts':
'''
The start timestamp of this process (if known). Is null
in most cases unless a process creation event is enabled
(e.g. task_newtask ftrace event on Linux/Android).
''',
'end_ts':
'''
The end timestamp of this process (if known). Is null in
most cases unless a process destruction event is enabled
(e.g. sched_process_free ftrace event on Linux/Android).
''',
'parent_upid':
ColumnDoc(
'''
The upid of the process which caused this process to be
spawned.
''',
joinable='process.upid'),
'uid':
ColumnDoc(
'The Unix user id of the process.',
joinable='package_list.uid'),
'android_appid':
'Android appid of this process.',
'cmdline':
'/proc/cmdline for this process.',
'arg_set_id':
ColumnDoc(
'Extra args for this process.', joinable='args.arg_set_id'),
'machine_id':
'''
Machine identifier, non-null for processes on a remote
machine.
''',
}))
THREAD_TABLE = Table(
python_module=__file__,
class_name='ThreadTable',
sql_name='__intrinsic_thread',
columns=[
C('utid', Alias(underlying_column='id')),
C('tid', CppUint32()),
C('name', CppOptional(CppString())),
C('start_ts', CppOptional(CppInt64())),
C('end_ts', CppOptional(CppInt64())),
C('upid', CppOptional(CppTableId(PROCESS_TABLE))),
C('is_main_thread', CppOptional(CppUint32())),
C('machine_id', CppOptional(CppTableId(MACHINE_TABLE))),
],
wrapping_sql_view=WrappingSqlView(view_name='thread',),
tabledoc=TableDoc(
doc='Contains information of threads seen during the trace',
group='Metadata',
skip_id_and_type=True,
columns={
'utid':
'''
Unique thread id. This is != the OS tid. This is a monotonic
number associated to each thread. The OS thread id (tid)
cannot be used as primary key because tids and pids are
recycled by most kernels.
''',
'tid':
'''
The OS id for this thread. Note: this is *not* unique over the
lifetime of the trace so cannot be used as a primary key. Use
|utid| instead.
''',
'name':
'''
The name of the thread. Can be populated from many sources
(e.g. ftrace, /proc scraping, track event etc).
''',
'start_ts':
'''
The start timestamp of this thread (if known). Is null in most
cases unless a thread creation event is enabled (e.g.
task_newtask ftrace event on Linux/Android).
''',
'end_ts':
'''
The end timestamp of this thread (if known). Is null in most
cases unless a thread destruction event is enabled (e.g.
sched_process_free ftrace event on Linux/Android).
''',
'upid':
ColumnDoc(
'The process hosting this thread.',
joinable='process.upid'),
'is_main_thread':
'''
Boolean indicating if this thread is the main thread
in the process.
''',
'machine_id':
'''
Machine identifier, non-null for threads on a remote machine.
''',
}))
CPU_TABLE = Table(
python_module=__file__,
class_name='CpuTable',
sql_name='__intrinsic_cpu',
columns=[
C('cpu', CppOptional(CppUint32())),
C('cluster_id', CppUint32()),
C('processor', CppString()),
C('machine_id', CppOptional(CppTableId(MACHINE_TABLE))),
C('capacity', CppOptional(CppUint32())),
C('arg_set_id', CppOptional(CppUint32())),
],
wrapping_sql_view=WrappingSqlView('cpu'),
tabledoc=TableDoc(
doc='''
Contains information of processes seen during the trace
''',
group='Misc',
columns={
'cpu':
'''the index (0-based) of the CPU core on the device''',
'cluster_id':
'''the cluster id is shared by CPUs in the same cluster''',
'processor':
'''a string describing this core''',
'machine_id':
'''
Machine identifier, non-null for CPUs on a remote machine.
''',
'capacity':
'''
Capacity of a CPU of a device, a metric which indicates the
relative performance of a CPU on a device
For details see:
https://www.kernel.org/doc/Documentation/devicetree/bindings/arm/cpu-capacity.txt
''',
'arg_set_id':
'''Extra args associated with the CPU''',
}))
RAW_TABLE = Table(
python_module=__file__,
class_name='RawTable',
sql_name='__intrinsic_raw',
columns=[
C('ts', CppInt64(), flags=ColumnFlag.SORTED),
C('name', CppString()),
C('utid', CppTableId(THREAD_TABLE)),
C('arg_set_id', CppUint32()),
C('common_flags', CppUint32()),
C('ucpu', CppTableId(CPU_TABLE))
],
wrapping_sql_view=WrappingSqlView('track'),
tabledoc=TableDoc(
doc='''
Contains 'raw' events from the trace for some types of events. This
table only exists for debugging purposes and should not be relied on
in production usecases (i.e. metrics, standard library etc).
If you are looking for ftrace_events: please use the ftrace_event table.
''',
group='Events',
columns={
'arg_set_id':
ColumnDoc(
'The set of key/value pairs associated with this event.',
joinable='args.arg_set_id'),
'ts':
'The timestamp of this event.',
'name':
'''
The name of the event. For ftrace events, this will be the
ftrace event name.
''',
'utid':
'The thread this event was emitted on.',
'common_flags':
'''
Ftrace event flags for this event. Currently only emitted for
sched_waking events.
''',
'ucpu':
'''
The unique CPU indentifier.
''',
}))
FTRACE_EVENT_TABLE = Table(
python_module=__file__,
class_name='FtraceEventTable',
sql_name='__intrinsic_ftrace_event',
parent=RAW_TABLE,
columns=[],
wrapping_sql_view=WrappingSqlView('ftrace_event'),
tabledoc=TableDoc(
doc='''
Contains all the ftrace events in the trace. This table exists only
for debugging purposes and should not be relied on in production
usecases (i.e. metrics, standard library etc). Note also that this
table might be empty if raw ftrace parsing has been disabled.
''',
group='Events',
columns={}))
ARG_TABLE = Table(
python_module=__file__,
class_name='ArgTable',
sql_name='__intrinsic_args',
columns=[
C('arg_set_id', CppUint32(), flags=ColumnFlag.SORTED),
C('flat_key', CppString()),
C('key', CppString()),
C('int_value', CppOptional(CppInt64())),
C('string_value', CppOptional(CppString())),
C('real_value', CppOptional(CppDouble())),
C('value_type', CppString()),
],
wrapping_sql_view=WrappingSqlView(view_name='args'),
tabledoc=TableDoc(
doc='''''',
group='Misc',
columns={
'arg_set_id': '''''',
'flat_key': '''''',
'key': '''''',
'int_value': '''''',
'string_value': '''''',
'real_value': '''''',
'value_type': ''''''
}))
METADATA_TABLE = Table(
python_module=__file__,
class_name='MetadataTable',
sql_name='metadata',
columns=[
C('name', CppString()),
C('key_type', CppString()),
C('int_value', CppOptional(CppInt64())),
C('str_value', CppOptional(CppString())),
],
tabledoc=TableDoc(
doc='''''',
group='Metadata',
columns={
'name': '''''',
'key_type': '''''',
'int_value': '''''',
'str_value': ''''''
}))
FILEDESCRIPTOR_TABLE = Table(
python_module=__file__,
class_name='FiledescriptorTable',
sql_name='filedescriptor',
columns=[
C('ufd', CppInt64()),
C('fd', CppInt64()),
C('ts', CppOptional(CppInt64())),
C('upid', CppOptional(CppUint32())),
C('path', CppOptional(CppString())),
],
tabledoc=TableDoc(
doc='''
Contains information of filedescriptors collected during the trace
''',
group='Metadata',
columns={
'ufd':
'''Unique fd. This is != the OS fd.
This is a monotonic number associated to each
filedescriptor. The OS assigned fd cannot be used as
primary key because fds are recycled by most kernels.''',
'fd':
'''The OS id for this process. Note: this is *not*
unique over the lifetime of the trace so cannot be
used as a primary key. Use |ufd| instead.''',
'ts':
'''The timestamp for when the fd was collected.''',
'upid':
''' The upid of the process which
opened the filedescriptor.''',
'path':
'''The path to the file or device backing the fd
In case this was a socket the path will be the port
number.'''
}))
EXP_MISSING_CHROME_PROC_TABLE = Table(
python_module=__file__,
class_name='ExpMissingChromeProcTable',
sql_name='experimental_missing_chrome_processes',
columns=[
C('upid', CppUint32()),
C('reliable_from', CppOptional(CppInt64())),
],
tabledoc=TableDoc(
doc='''
Experimental table, subject to arbitrary breaking changes.
''',
group='Chrome',
columns={
'upid': '''''',
'reliable_from': ''''''
}))
CPU_FREQ_TABLE = Table(
python_module=__file__,
class_name='CpuFreqTable',
sql_name='__intrinsic_cpu_freq',
columns=[
C('ucpu', CppTableId(CPU_TABLE)),
C('freq', CppUint32()),
],
wrapping_sql_view=WrappingSqlView('cpu_freq'),
tabledoc=TableDoc(
doc='''''', group='Misc', columns={
'ucpu': '''''',
'freq': '''''',
}))
CLOCK_SNAPSHOT_TABLE = Table(
python_module=__file__,
class_name='ClockSnapshotTable',
sql_name='clock_snapshot',
columns=[
C('ts', CppInt64()),
C('clock_id', CppInt64()),
C('clock_name', CppOptional(CppString())),
C('clock_value', CppInt64()),
C('snapshot_id', CppUint32()),
C('machine_id', CppOptional(CppTableId(MACHINE_TABLE))),
],
tabledoc=TableDoc(
doc='''
Contains all the mapping between clock snapshots and trace time.
NOTE: this table is not sorted by timestamp; this is why we omit the
sorted flag on the ts column.
''',
group='Misc',
columns={
'ts':
'''timestamp of the snapshot in trace time.''',
'clock_id':
'''id of the clock (corresponds to the id in the trace).''',
'clock_name':
'''the name of the clock for builtin clocks or null
otherwise.''',
'clock_value':
'''timestamp of the snapshot in clock time.''',
'snapshot_id':
'''the index of this snapshot (only useful for debugging)''',
'machine_id':
'''
Machine identifier, non-null for clock snapshots on a remote
machine.
''',
}))
TRACE_FILE_TABLE = Table(
python_module=__file__,
class_name='TraceFileTable',
sql_name='__intrinsic_trace_file',
columns=[
C('parent_id', CppOptional(CppSelfTableId())),
C('name', CppOptional(CppString())),
C('size', CppInt64()),
C('trace_type', CppString()),
C('processing_order', CppOptional(CppInt64())),
],
wrapping_sql_view=WrappingSqlView('trace_file'),
tabledoc=TableDoc(
doc='''
Metadata related to the trace file parsed. Note the order in which
the files appear in this table corresponds to the order in which
they are read and sent to the tokenization stage.
''',
group='Misc',
columns={
'parent_id':
'''
Parent file. E.g. files contained in a zip file will point to
the zip file.
''',
'name':
'''File name, if known, NULL otherwise''',
'size':
'''Size in bytes''',
'trace_type':
'''Trace type''',
'processing_order':
'''In which order where the files were processed.''',
}))
# Keep this list sorted.
ALL_TABLES = [
ARG_TABLE,
CLOCK_SNAPSHOT_TABLE,
CPU_FREQ_TABLE,
CPU_TABLE,
EXP_MISSING_CHROME_PROC_TABLE,
FILEDESCRIPTOR_TABLE,
FTRACE_EVENT_TABLE,
MACHINE_TABLE,
METADATA_TABLE,
PROCESS_TABLE,
RAW_TABLE,
THREAD_TABLE,
TRACE_FILE_TABLE,
]