docstr: Rebuild the dask graph annotation which contains the full id history
  
  Note that this may not match the original annotation in case of TaskGroup
  collision.
docstr_tok: ["Rebuild","the","dask","graph","annotation","which","contains","the","full","id","history","Note","that","this","may","not","match","the","original","annotation","in","case","of","TaskGroup","collision","."]
code: def annotation(self) -> dict[str, tuple[str, ...]] | None:
      """Rebuild the dask graph annotation which contains the full id history
  
      Note that this may not match the original annotation in case of TaskGroup
      collision.
      """
      if self.name == ("default",):
          return None
      ids = []
      node: Span | None = self
      while node:
          ids.append(node.id)
          node = node.parent
      return {"name": self.name, "ids": tuple(reversed(ids))}
  
imports: from __future__ import annotations
  import uuid
  import weakref
  from collections import defaultdict
  from collections.abc import Hashable, Iterable, Iterator
  from contextlib import contextmanager
  from itertools import islice
  from typing import TYPE_CHECKING, Any
  import dask.config
  from dask.typing import Key
  from distributed.collections import sum_mappings
  from distributed.itertools import ffill
  from distributed.metrics import time
label_desc: Use image node_id 4 for calling the Span obj's underlying member method code with example usage: obj.annotation() and returns: dict, None