opentelemetry-instrumentation 0.47b0__tar.gz → 0.48b0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/PKG-INFO +1 -1
  2. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/_semconv.py +35 -21
  3. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/bootstrap.py +1 -1
  4. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/bootstrap_gen.py +54 -55
  5. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/version.py +1 -1
  6. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/test_bootstrap.py +1 -1
  7. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/.gitignore +0 -0
  8. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/LICENSE +0 -0
  9. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/README.rst +0 -0
  10. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/pyproject.toml +0 -0
  11. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/auto_instrumentation/__init__.py +0 -0
  12. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/auto_instrumentation/_load.py +0 -0
  13. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py +0 -0
  14. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/dependencies.py +0 -0
  15. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/distro.py +0 -0
  16. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/environment_variables.py +0 -0
  17. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/instrumentor.py +0 -0
  18. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/propagators.py +0 -0
  19. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/py.typed +0 -0
  20. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/sqlcommenter_utils.py +0 -0
  21. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/src/opentelemetry/instrumentation/utils.py +0 -0
  22. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/__init__.py +0 -0
  23. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/auto_instrumentation/test_load.py +0 -0
  24. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/auto_instrumentation/test_run.py +0 -0
  25. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/test_dependencies.py +0 -0
  26. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/test_distro.py +0 -0
  27. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/test_instrumentor.py +0 -0
  28. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/test_propagators.py +0 -0
  29. {opentelemetry_instrumentation-0.47b0 → opentelemetry_instrumentation-0.48b0}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: opentelemetry-instrumentation
3
- Version: 0.47b0
3
+ Version: 0.48b0
4
4
  Summary: Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python
5
5
  Project-URL: Homepage, https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation
6
6
  Author-email: OpenTelemetry Authors <cncf-opentelemetry-contributors@lists.cncf.io>
@@ -252,16 +252,32 @@ def _set_http_scheme(result, scheme, sem_conv_opt_in_mode):
252
252
  set_string_attribute(result, URL_SCHEME, scheme)
253
253
 
254
254
 
255
- def _set_http_host(result, host, sem_conv_opt_in_mode):
255
+ def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
256
256
  if _report_old(sem_conv_opt_in_mode):
257
- set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
257
+ set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
258
258
  if _report_new(sem_conv_opt_in_mode):
259
- set_string_attribute(result, SERVER_ADDRESS, host)
259
+ set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
260
+
261
+
262
+ def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
263
+ if _report_old(sem_conv_opt_in_mode):
264
+ set_string_attribute(
265
+ result, SpanAttributes.HTTP_USER_AGENT, user_agent
266
+ )
267
+ if _report_new(sem_conv_opt_in_mode):
268
+ set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
260
269
 
261
270
 
262
271
  # Client
263
272
 
264
273
 
274
+ def _set_http_host_client(result, host, sem_conv_opt_in_mode):
275
+ if _report_old(sem_conv_opt_in_mode):
276
+ set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
277
+ if _report_new(sem_conv_opt_in_mode):
278
+ set_string_attribute(result, SERVER_ADDRESS, host)
279
+
280
+
265
281
  def _set_http_net_peer_name_client(result, peer_name, sem_conv_opt_in_mode):
266
282
  if _report_old(sem_conv_opt_in_mode):
267
283
  set_string_attribute(result, SpanAttributes.NET_PEER_NAME, peer_name)
@@ -310,27 +326,32 @@ def _set_http_target(result, target, path, query, sem_conv_opt_in_mode):
310
326
  set_string_attribute(result, URL_QUERY, query)
311
327
 
312
328
 
313
- def _set_http_peer_ip(result, ip, sem_conv_opt_in_mode):
329
+ def _set_http_host_server(result, host, sem_conv_opt_in_mode):
314
330
  if _report_old(sem_conv_opt_in_mode):
315
- set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
331
+ set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
316
332
  if _report_new(sem_conv_opt_in_mode):
317
- set_string_attribute(result, CLIENT_ADDRESS, ip)
333
+ set_string_attribute(result, CLIENT_ADDRESS, host)
318
334
 
319
335
 
320
- def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
336
+ # net.peer.ip -> net.sock.peer.addr
337
+ # https://github.com/open-telemetry/semantic-conventions/blob/40db676ca0e735aa84f242b5a0fb14e49438b69b/schemas/1.15.0#L18
338
+ # net.sock.peer.addr -> client.socket.address for server spans (TODO) AND client.address if missing
339
+ # https://github.com/open-telemetry/semantic-conventions/blob/v1.21.0/CHANGELOG.md#v1210-2023-07-13
340
+ # https://github.com/open-telemetry/semantic-conventions/blob/main/docs/non-normative/http-migration.md#common-attributes-across-http-client-and-server-spans
341
+ def _set_http_peer_ip_server(result, ip, sem_conv_opt_in_mode):
321
342
  if _report_old(sem_conv_opt_in_mode):
322
- set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
343
+ set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
323
344
  if _report_new(sem_conv_opt_in_mode):
324
- set_int_attribute(result, CLIENT_PORT, port)
345
+ # Only populate if not already populated
346
+ if not result.get(CLIENT_ADDRESS):
347
+ set_string_attribute(result, CLIENT_ADDRESS, ip)
325
348
 
326
349
 
327
- def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
350
+ def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
328
351
  if _report_old(sem_conv_opt_in_mode):
329
- set_string_attribute(
330
- result, SpanAttributes.HTTP_USER_AGENT, user_agent
331
- )
352
+ set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
332
353
  if _report_new(sem_conv_opt_in_mode):
333
- set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
354
+ set_int_attribute(result, CLIENT_PORT, port)
334
355
 
335
356
 
336
357
  def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
@@ -340,13 +361,6 @@ def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
340
361
  set_string_attribute(result, CLIENT_ADDRESS, name)
341
362
 
342
363
 
343
- def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
344
- if _report_old(sem_conv_opt_in_mode):
345
- set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
346
- if _report_new(sem_conv_opt_in_mode):
347
- set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
348
-
349
-
350
364
  def _set_status(
351
365
  span,
352
366
  metrics_attributes: dict,
@@ -119,7 +119,7 @@ def _find_installed_libraries():
119
119
 
120
120
  def _run_requirements():
121
121
  logger.setLevel(logging.ERROR)
122
- print("\n".join(_find_installed_libraries()), end="")
122
+ print("\n".join(_find_installed_libraries()))
123
123
 
124
124
 
125
125
  def _run_install():
@@ -18,180 +18,179 @@
18
18
  libraries = [
19
19
  {
20
20
  "library": "aio_pika >= 7.2.0, < 10.0.0",
21
- "instrumentation": "opentelemetry-instrumentation-aio-pika==0.47b0",
21
+ "instrumentation": "opentelemetry-instrumentation-aio-pika==0.48b0",
22
22
  },
23
23
  {
24
24
  "library": "aiohttp ~= 3.0",
25
- "instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.47b0",
25
+ "instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.48b0",
26
26
  },
27
27
  {
28
28
  "library": "aiohttp ~= 3.0",
29
- "instrumentation": "opentelemetry-instrumentation-aiohttp-server==0.47b0",
29
+ "instrumentation": "opentelemetry-instrumentation-aiohttp-server==0.48b0",
30
30
  },
31
31
  {
32
32
  "library": "aiopg >= 0.13.0, < 2.0.0",
33
- "instrumentation": "opentelemetry-instrumentation-aiopg==0.47b0",
33
+ "instrumentation": "opentelemetry-instrumentation-aiopg==0.48b0",
34
34
  },
35
35
  {
36
36
  "library": "asgiref ~= 3.0",
37
- "instrumentation": "opentelemetry-instrumentation-asgi==0.47b0",
37
+ "instrumentation": "opentelemetry-instrumentation-asgi==0.48b0",
38
38
  },
39
39
  {
40
40
  "library": "asyncpg >= 0.12.0",
41
- "instrumentation": "opentelemetry-instrumentation-asyncpg==0.47b0",
41
+ "instrumentation": "opentelemetry-instrumentation-asyncpg==0.48b0",
42
42
  },
43
43
  {
44
44
  "library": "boto~=2.0",
45
- "instrumentation": "opentelemetry-instrumentation-boto==0.47b0",
45
+ "instrumentation": "opentelemetry-instrumentation-boto==0.48b0",
46
46
  },
47
47
  {
48
48
  "library": "boto3 ~= 1.0",
49
- "instrumentation": "opentelemetry-instrumentation-boto3sqs==0.47b0",
49
+ "instrumentation": "opentelemetry-instrumentation-boto3sqs==0.48b0",
50
50
  },
51
51
  {
52
52
  "library": "botocore ~= 1.0",
53
- "instrumentation": "opentelemetry-instrumentation-botocore==0.47b0",
53
+ "instrumentation": "opentelemetry-instrumentation-botocore==0.48b0",
54
54
  },
55
55
  {
56
56
  "library": "cassandra-driver ~= 3.25",
57
- "instrumentation": "opentelemetry-instrumentation-cassandra==0.47b0",
57
+ "instrumentation": "opentelemetry-instrumentation-cassandra==0.48b0",
58
58
  },
59
59
  {
60
60
  "library": "scylla-driver ~= 3.25",
61
- "instrumentation": "opentelemetry-instrumentation-cassandra==0.47b0",
61
+ "instrumentation": "opentelemetry-instrumentation-cassandra==0.48b0",
62
62
  },
63
63
  {
64
64
  "library": "celery >= 4.0, < 6.0",
65
- "instrumentation": "opentelemetry-instrumentation-celery==0.47b0",
65
+ "instrumentation": "opentelemetry-instrumentation-celery==0.48b0",
66
66
  },
67
67
  {
68
68
  "library": "confluent-kafka >= 1.8.2, <= 2.4.0",
69
- "instrumentation": "opentelemetry-instrumentation-confluent-kafka==0.47b0",
69
+ "instrumentation": "opentelemetry-instrumentation-confluent-kafka==0.48b0",
70
70
  },
71
71
  {
72
72
  "library": "django >= 1.10",
73
- "instrumentation": "opentelemetry-instrumentation-django==0.47b0",
73
+ "instrumentation": "opentelemetry-instrumentation-django==0.48b0",
74
74
  },
75
75
  {
76
76
  "library": "elasticsearch >= 6.0",
77
- "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.47b0",
77
+ "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.48b0",
78
78
  },
79
79
  {
80
80
  "library": "falcon >= 1.4.1, < 3.1.2",
81
- "instrumentation": "opentelemetry-instrumentation-falcon==0.47b0",
81
+ "instrumentation": "opentelemetry-instrumentation-falcon==0.48b0",
82
82
  },
83
83
  {
84
84
  "library": "fastapi ~= 0.58",
85
- "instrumentation": "opentelemetry-instrumentation-fastapi==0.47b0",
86
- },
87
- {
88
- "library": "fastapi-slim ~= 0.111.0",
89
- "instrumentation": "opentelemetry-instrumentation-fastapi==0.47b0",
85
+ "instrumentation": "opentelemetry-instrumentation-fastapi==0.48b0",
90
86
  },
91
87
  {
92
88
  "library": "flask >= 1.0",
93
- "instrumentation": "opentelemetry-instrumentation-flask==0.47b0",
89
+ "instrumentation": "opentelemetry-instrumentation-flask==0.48b0",
94
90
  },
95
91
  {
96
92
  "library": "grpcio ~= 1.27",
97
- "instrumentation": "opentelemetry-instrumentation-grpc==0.47b0",
93
+ "instrumentation": "opentelemetry-instrumentation-grpc==0.48b0",
98
94
  },
99
95
  {
100
96
  "library": "httpx >= 0.18.0",
101
- "instrumentation": "opentelemetry-instrumentation-httpx==0.47b0",
97
+ "instrumentation": "opentelemetry-instrumentation-httpx==0.48b0",
102
98
  },
103
99
  {
104
100
  "library": "jinja2 >= 2.7, < 4.0",
105
- "instrumentation": "opentelemetry-instrumentation-jinja2==0.47b0",
101
+ "instrumentation": "opentelemetry-instrumentation-jinja2==0.48b0",
102
+ },
103
+ {
104
+ "library": "kafka-python >= 2.0, < 3.0",
105
+ "instrumentation": "opentelemetry-instrumentation-kafka-python==0.48b0",
106
106
  },
107
107
  {
108
- "library": "kafka-python >= 2.0",
109
- "instrumentation": "opentelemetry-instrumentation-kafka-python==0.47b0",
108
+ "library": "kafka-python-ng >= 2.0, < 3.0",
109
+ "instrumentation": "opentelemetry-instrumentation-kafka-python==0.48b0",
110
110
  },
111
111
  {
112
- "library": "mysql-connector-python ~= 8.0",
113
- "instrumentation": "opentelemetry-instrumentation-mysql==0.47b0",
112
+ "library": "mysql-connector-python >= 8.0, < 10.0",
113
+ "instrumentation": "opentelemetry-instrumentation-mysql==0.48b0",
114
114
  },
115
115
  {
116
116
  "library": "mysqlclient < 3",
117
- "instrumentation": "opentelemetry-instrumentation-mysqlclient==0.47b0",
117
+ "instrumentation": "opentelemetry-instrumentation-mysqlclient==0.48b0",
118
118
  },
119
119
  {
120
120
  "library": "pika >= 0.12.0",
121
- "instrumentation": "opentelemetry-instrumentation-pika==0.47b0",
121
+ "instrumentation": "opentelemetry-instrumentation-pika==0.48b0",
122
122
  },
123
123
  {
124
124
  "library": "psycopg >= 3.1.0",
125
- "instrumentation": "opentelemetry-instrumentation-psycopg==0.47b0",
125
+ "instrumentation": "opentelemetry-instrumentation-psycopg==0.48b0",
126
126
  },
127
127
  {
128
128
  "library": "psycopg2 >= 2.7.3.1",
129
- "instrumentation": "opentelemetry-instrumentation-psycopg2==0.47b0",
129
+ "instrumentation": "opentelemetry-instrumentation-psycopg2==0.48b0",
130
130
  },
131
131
  {
132
132
  "library": "pymemcache >= 1.3.5, < 5",
133
- "instrumentation": "opentelemetry-instrumentation-pymemcache==0.47b0",
133
+ "instrumentation": "opentelemetry-instrumentation-pymemcache==0.48b0",
134
134
  },
135
135
  {
136
136
  "library": "pymongo >= 3.1, < 5.0",
137
- "instrumentation": "opentelemetry-instrumentation-pymongo==0.47b0",
137
+ "instrumentation": "opentelemetry-instrumentation-pymongo==0.48b0",
138
138
  },
139
139
  {
140
140
  "library": "PyMySQL < 2",
141
- "instrumentation": "opentelemetry-instrumentation-pymysql==0.47b0",
141
+ "instrumentation": "opentelemetry-instrumentation-pymysql==0.48b0",
142
142
  },
143
143
  {
144
144
  "library": "pyramid >= 1.7",
145
- "instrumentation": "opentelemetry-instrumentation-pyramid==0.47b0",
145
+ "instrumentation": "opentelemetry-instrumentation-pyramid==0.48b0",
146
146
  },
147
147
  {
148
148
  "library": "redis >= 2.6",
149
- "instrumentation": "opentelemetry-instrumentation-redis==0.47b0",
149
+ "instrumentation": "opentelemetry-instrumentation-redis==0.48b0",
150
150
  },
151
151
  {
152
152
  "library": "remoulade >= 0.50",
153
- "instrumentation": "opentelemetry-instrumentation-remoulade==0.47b0",
153
+ "instrumentation": "opentelemetry-instrumentation-remoulade==0.48b0",
154
154
  },
155
155
  {
156
156
  "library": "requests ~= 2.0",
157
- "instrumentation": "opentelemetry-instrumentation-requests==0.47b0",
157
+ "instrumentation": "opentelemetry-instrumentation-requests==0.48b0",
158
158
  },
159
159
  {
160
160
  "library": "sqlalchemy",
161
- "instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.47b0",
161
+ "instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.48b0",
162
162
  },
163
163
  {
164
164
  "library": "starlette ~= 0.13.0",
165
- "instrumentation": "opentelemetry-instrumentation-starlette==0.47b0",
165
+ "instrumentation": "opentelemetry-instrumentation-starlette==0.48b0",
166
166
  },
167
167
  {
168
168
  "library": "psutil >= 5",
169
- "instrumentation": "opentelemetry-instrumentation-system-metrics==0.47b0",
169
+ "instrumentation": "opentelemetry-instrumentation-system-metrics==0.48b0",
170
170
  },
171
171
  {
172
172
  "library": "tornado >= 5.1.1",
173
- "instrumentation": "opentelemetry-instrumentation-tornado==0.47b0",
173
+ "instrumentation": "opentelemetry-instrumentation-tornado==0.48b0",
174
174
  },
175
175
  {
176
176
  "library": "tortoise-orm >= 0.17.0",
177
- "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.47b0",
177
+ "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.48b0",
178
178
  },
179
179
  {
180
180
  "library": "pydantic >= 1.10.2",
181
- "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.47b0",
181
+ "instrumentation": "opentelemetry-instrumentation-tortoiseorm==0.48b0",
182
182
  },
183
183
  {
184
184
  "library": "urllib3 >= 1.0.0, < 3.0.0",
185
- "instrumentation": "opentelemetry-instrumentation-urllib3==0.47b0",
185
+ "instrumentation": "opentelemetry-instrumentation-urllib3==0.48b0",
186
186
  },
187
187
  ]
188
188
  default_instrumentations = [
189
- "opentelemetry-instrumentation-asyncio==0.47b0",
190
- "opentelemetry-instrumentation-aws-lambda==0.47b0",
191
- "opentelemetry-instrumentation-dbapi==0.47b0",
192
- "opentelemetry-instrumentation-logging==0.47b0",
193
- "opentelemetry-instrumentation-sqlite3==0.47b0",
194
- "opentelemetry-instrumentation-threading==0.47b0",
195
- "opentelemetry-instrumentation-urllib==0.47b0",
196
- "opentelemetry-instrumentation-wsgi==0.47b0",
189
+ "opentelemetry-instrumentation-asyncio==0.48b0",
190
+ "opentelemetry-instrumentation-dbapi==0.48b0",
191
+ "opentelemetry-instrumentation-logging==0.48b0",
192
+ "opentelemetry-instrumentation-sqlite3==0.48b0",
193
+ "opentelemetry-instrumentation-threading==0.48b0",
194
+ "opentelemetry-instrumentation-urllib==0.48b0",
195
+ "opentelemetry-instrumentation-wsgi==0.48b0",
197
196
  ]
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- __version__ = "0.47b0"
15
+ __version__ = "0.48b0"
@@ -77,7 +77,7 @@ class TestBootstrap(TestCase):
77
77
  bootstrap.run()
78
78
  self.assertEqual(
79
79
  fake_out.getvalue(),
80
- "\n".join(self.installed_libraries),
80
+ "\n".join(self.installed_libraries) + "\n",
81
81
  )
82
82
 
83
83
  @patch("sys.argv", ["bootstrap", "-a", "install"])