Use `name=__name__` for logs throughout `.service`

Change all `.service` sub-modules to use `get_logger(name=__name__)`
for per-submod instances vs a shared `._util.log`.

Deats,
- import `get_logger()` and `get_console_log()` from top-level
  `piker.log` instead of `._util` for all.
- drop `log` and `get_console_log()` partial from `._util`.
- add `name=subsys` kwarg to `get_console_log()` call in
  `_actor_runtime.maybe_open_pikerd()`.
- add `name='piker.service'` to `get_console_log()` in
  `_ahab.open_ahabd()`.
- change default `loglevel` from `None` to `'cancel'` in
  `_ahab.open_ahabd()`.
- add sanity check: `assert log.name == 'piker.service'` in
  `_daemon.maybe_spawn_daemon()`.
- change `print()` -> `log.info()` in `_registry.find_service()`.
- drop stray `from piker.service._util import log` import in
  `brokers._daemon.spawn_brokerd()`.

Styling/cleanups,
- drop blank lines from various fn sigs.
- do more sin-ws union type annots.
- add more multiline style to `or` expressions in `_actor_runtime` and
  `_registry`.
- update `._util` docstring with TODO about `import`-time console
  log setup.
- add TODO comments in `_registry` about UDS registry support.
- use `.aid.uid` from actor in `_registry.open_registry()`.
- add intermediate var `reg_addrs` in `_registry.open_registry()` (bc
  i was tracing rtvs value issues in `tractor`).
- add `pformat` import to `.elastic` (code path is currently
  not used but figured might as well appease the linter..)

(this commit msg was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
fix_tractor_logging
Gud Boi 2026-02-13 14:34:45 -05:00
parent 2516d97fe4
commit 9a97c477e2
9 changed files with 97 additions and 62 deletions

View File

@ -200,7 +200,6 @@ def broker_init(
async def spawn_brokerd( async def spawn_brokerd(
brokername: str, brokername: str,
loglevel: str | None = None, loglevel: str | None = None,
@ -208,8 +207,10 @@ async def spawn_brokerd(
) -> bool: ) -> bool:
from piker.service._util import log # use service mngr log log.info(
log.info(f'Spawning {brokername} broker daemon') f'Spawning broker-daemon,\n'
f'backend: {brokername!r}'
)
( (
brokermode, brokermode,

View File

@ -31,9 +31,12 @@ from contextlib import (
import tractor import tractor
import trio import trio
from ._util import ( from piker.log import (
get_console_log, get_console_log,
) )
from ._util import (
subsys,
)
from ._mngr import ( from ._mngr import (
Services, Services,
) )
@ -96,7 +99,8 @@ async def open_piker_runtime(
# setting it as the root actor on localhost. # setting it as the root actor on localhost.
registry_addrs = ( registry_addrs = (
registry_addrs registry_addrs
or [_default_reg_addr] or
[_default_reg_addr]
) )
if ems := tractor_kwargs.pop('enable_modules', None): if ems := tractor_kwargs.pop('enable_modules', None):
@ -271,6 +275,7 @@ async def maybe_open_pikerd(
''' '''
if loglevel: if loglevel:
get_console_log( get_console_log(
name=subsys,
level=loglevel level=loglevel
) )

View File

@ -49,13 +49,15 @@ from requests.exceptions import (
ReadTimeout, ReadTimeout,
) )
from ._mngr import Services from piker.log import (
from ._util import (
log, # sub-sys logger
get_console_log, get_console_log,
get_logger,
) )
from ._mngr import Services
from .. import config from .. import config
log = get_logger(name=__name__)
class DockerNotStarted(Exception): class DockerNotStarted(Exception):
'Prolly you dint start da daemon bruh' 'Prolly you dint start da daemon bruh'
@ -336,13 +338,16 @@ class Container:
async def open_ahabd( async def open_ahabd(
ctx: tractor.Context, ctx: tractor.Context,
endpoint: str, # ns-pointer str-msg-type endpoint: str, # ns-pointer str-msg-type
loglevel: str | None = None, loglevel: str = 'cancel',
**ep_kwargs, **ep_kwargs,
) -> None: ) -> None:
log = get_console_log(loglevel or 'cancel') log = get_console_log(
level=loglevel,
name='piker.service',
)
async with open_docker() as client: async with open_docker() as client:

View File

@ -45,7 +45,6 @@ log = get_logger(name=__name__)
@acm @acm
async def maybe_spawn_daemon( async def maybe_spawn_daemon(
service_name: str, service_name: str,
service_task_target: Callable, service_task_target: Callable,
@ -69,10 +68,12 @@ async def maybe_spawn_daemon(
clients. clients.
''' '''
get_console_log( log = get_console_log(
level=loglevel, level=loglevel,
name=__name__, name=__name__,
) )
assert log.name == 'piker.service'
# serialize access to this section to avoid # serialize access to this section to avoid
# 2 or more tasks racing to create a daemon # 2 or more tasks racing to create a daemon
lock = Services.locks[service_name] lock = Services.locks[service_name]
@ -159,7 +160,6 @@ async def maybe_spawn_daemon(
async def spawn_emsd( async def spawn_emsd(
loglevel: str|None = None, loglevel: str|None = None,
**extra_tractor_kwargs **extra_tractor_kwargs
@ -197,7 +197,6 @@ async def spawn_emsd(
@acm @acm
async def maybe_open_emsd( async def maybe_open_emsd(
brokername: str, brokername: str,
loglevel: str|None = None, loglevel: str|None = None,

View File

@ -34,9 +34,9 @@ from tractor import (
Portal, Portal,
) )
from ._util import ( from piker.log import get_logger
log, # sub-sys logger
) log = get_logger(name=__name__)
# TODO: we need remote wrapping and a general soln: # TODO: we need remote wrapping and a general soln:

View File

@ -27,15 +27,29 @@ from typing import (
) )
import tractor import tractor
from tractor import Portal from tractor import (
msg,
from ._util import ( Actor,
log, # sub-sys logger Portal,
) )
from piker.log import get_logger
log = get_logger(name=__name__)
# TODO? default path-space for UDS registry?
# [ ] needs to be Xplatform tho!
# _default_registry_path: Path = (
# Path(os.environ['XDG_RUNTIME_DIR'])
# /'piker'
# )
_default_registry_host: str = '127.0.0.1' _default_registry_host: str = '127.0.0.1'
_default_registry_port: int = 6116 _default_registry_port: int = 6116
_default_reg_addr: tuple[str, int] = ( _default_reg_addr: tuple[
str,
int, # |str TODO, once we support UDS, see above.
] = (
_default_registry_host, _default_registry_host,
_default_registry_port, _default_registry_port,
) )
@ -75,16 +89,22 @@ async def open_registry(
''' '''
global _tractor_kwargs global _tractor_kwargs
actor = tractor.current_actor() actor: Actor = tractor.current_actor()
uid = actor.uid aid: msg.Aid = actor.aid
preset_reg_addrs: list[tuple[str, int]] = Registry.addrs uid: tuple[str, str] = aid.uid
preset_reg_addrs: list[
tuple[str, int]
] = Registry.addrs
if ( if (
preset_reg_addrs preset_reg_addrs
and addrs and
addrs
): ):
if preset_reg_addrs != addrs: if preset_reg_addrs != addrs:
# if any(addr in preset_reg_addrs for addr in addrs): # if any(addr in preset_reg_addrs for addr in addrs):
diff: set[tuple[str, int]] = set(preset_reg_addrs) - set(addrs) diff: set[
tuple[str, int]
] = set(preset_reg_addrs) - set(addrs)
if diff: if diff:
log.warning( log.warning(
f'`{uid}` requested only subset of registrars: {addrs}\n' f'`{uid}` requested only subset of registrars: {addrs}\n'
@ -98,7 +118,6 @@ async def open_registry(
) )
was_set: bool = False was_set: bool = False
if ( if (
not tractor.is_root_process() not tractor.is_root_process()
and and
@ -115,16 +134,23 @@ async def open_registry(
f"`{uid}` registry should already exist but doesn't?" f"`{uid}` registry should already exist but doesn't?"
) )
if ( if not Registry.addrs:
not Registry.addrs
):
was_set = True was_set = True
Registry.addrs = addrs or [_default_reg_addr] Registry.addrs = (
addrs
or
[_default_reg_addr]
)
# NOTE: only spot this seems currently used is inside # NOTE: only spot this seems currently used is inside
# `.ui._exec` which is the (eventual qtloops) bootstrapping # `.ui._exec` which is the (eventual qtloops) bootstrapping
# with guest mode. # with guest mode.
_tractor_kwargs['registry_addrs'] = Registry.addrs reg_addrs: list[tuple[str, str|int]] = Registry.addrs
# !TODO, a struct-API to stringently allow this only in special
# cases?
# -> better would be to have some way to (atomically) rewrite
# and entire `RuntimeVars`?? ideas welcome obvi..
_tractor_kwargs['registry_addrs'] = reg_addrs
try: try:
yield Registry.addrs yield Registry.addrs
@ -149,7 +175,7 @@ async def find_service(
| None | None
): ):
# try: # try:
reg_addrs: list[tuple[str, int]] reg_addrs: list[tuple[str, int|str]]
async with open_registry( async with open_registry(
addrs=( addrs=(
registry_addrs registry_addrs
@ -172,15 +198,13 @@ async def find_service(
only_first=first_only, # if set only returns single ref only_first=first_only, # if set only returns single ref
) as maybe_portals: ) as maybe_portals:
if not maybe_portals: if not maybe_portals:
# log.info( log.info(
print(
f'Could NOT find service {service_name!r} -> {maybe_portals!r}' f'Could NOT find service {service_name!r} -> {maybe_portals!r}'
) )
yield None yield None
return return
# log.info( log.info(
print(
f'Found service {service_name!r} -> {maybe_portals}' f'Found service {service_name!r} -> {maybe_portals}'
) )
yield maybe_portals yield maybe_portals
@ -195,7 +219,6 @@ async def find_service(
async def check_for_service( async def check_for_service(
service_name: str, service_name: str,
) -> None|tuple[str, int]: ) -> None|tuple[str, int]:
''' '''
Service daemon "liveness" predicate. Service daemon "liveness" predicate.

View File

@ -14,20 +14,12 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
Sub-sys module commons. Sub-sys module commons (if any ?? Bp).
""" """
from functools import partial
from ..log import (
get_logger,
get_console_log,
)
subsys: str = 'piker.service' subsys: str = 'piker.service'
log = get_logger(subsys) # ?TODO, if we were going to keep a `get_console_log()` in here to be
# invoked at `import`-time, how do we dynamically hand in the
get_console_log = partial( # `level=` value? seems too early in the runtime to be injected
get_console_log, # right?
name=subsys,
)

View File

@ -16,6 +16,7 @@
from __future__ import annotations from __future__ import annotations
from contextlib import asynccontextmanager as acm from contextlib import asynccontextmanager as acm
from pprint import pformat
from typing import ( from typing import (
Any, Any,
TYPE_CHECKING, TYPE_CHECKING,
@ -26,12 +27,17 @@ import asks
if TYPE_CHECKING: if TYPE_CHECKING:
import docker import docker
from ._ahab import DockerContainer from ._ahab import DockerContainer
from . import (
from ._util import log # sub-sys logger Services,
from ._util import (
get_console_log,
) )
from piker.log import (
get_console_log,
get_logger,
)
log = get_logger(name=__name__)
# container level config # container level config
_config = { _config = {
@ -67,7 +73,10 @@ def start_elasticsearch(
elastic elastic
''' '''
get_console_log('info', name=__name__) get_console_log(
level='info',
name=__name__,
)
dcntr: DockerContainer = client.containers.run( dcntr: DockerContainer = client.containers.run(
'piker:elastic', 'piker:elastic',

View File

@ -52,17 +52,18 @@ import pendulum
# TODO: import this for specific error set expected by mkts client # TODO: import this for specific error set expected by mkts client
# import purerpc # import purerpc
from ..data.feed import maybe_open_feed from piker.data.feed import maybe_open_feed
from . import Services from . import Services
from ._util import ( from piker.log import (
log, # sub-sys logger
get_console_log, get_console_log,
get_logger,
) )
if TYPE_CHECKING: if TYPE_CHECKING:
import docker import docker
from ._ahab import DockerContainer from ._ahab import DockerContainer
log = get_logger(name=__name__)
# ahabd-supervisor and container level config # ahabd-supervisor and container level config