{"record":{"id":"753d7a18b1a3bcce","repo":"influxdata/influxdb","slug":"measurement-name-cannot-contain-spaces","errorCode":null,"errorMessage":"Measurement name cannot contain spaces","messagePattern":"Measurement name cannot contain spaces","errorType":"exception","errorClass":"InvalidMeasurementError","httpStatus":null,"severity":"error","filePath":"influxdb3_py_api/src/line_builder/line_builder.py","lineNumber":32,"sourceCode":"    pass\n\n\nclass InvalidKeyError(InfluxDBError):\n    \"\"\"Raised when a tag or field key is invalid\"\"\"\n\n    pass\n\n\nclass InvalidLineError(InfluxDBError):\n    \"\"\"Raised when a line protocol string is invalid\"\"\"\n\n    pass\n\n\nclass LineBuilder:\n    def __init__(self, measurement: str):\n        if \" \" in measurement:\n            raise InvalidMeasurementError(\"Measurement name cannot contain spaces\")\n        self.measurement = measurement\n        self.tags: OrderedDict[str, str] = OrderedDict()\n        self.fields: OrderedDict[str, str] = OrderedDict()\n        self._timestamp_ns: Optional[int] = None\n\n    def _validate_key(self, key: str, key_type: str) -> None:\n        \"\"\"Validate that a key does not contain spaces, commas, or equals signs.\"\"\"\n        if not key:\n            raise InvalidKeyError(f\"{key_type} key cannot be empty\")\n        if \" \" in key:\n            raise InvalidKeyError(f\"{key_type} key '{key}' cannot contain spaces\")\n        if \",\" in key:\n            raise InvalidKeyError(f\"{key_type} key '{key}' cannot contain commas\")\n        if \"=\" in key:\n            raise InvalidKeyError(f\"{key_type} key '{key}' cannot contain equals signs\")\n\n    def _escape_measurement(self, value: str) -> str:\n        \"\"\"Escape characters in measurement names according to line protocol.\"\"\"","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_py_api/src/line_builder/line_builder.py#L14-L50","documentation":"The Python SDK's LineBuilder is a helper for constructing InfluxDB line protocol strings. Measurement names are taken as-is and spaces are not valid unescaped measurement separators in line protocol, so the constructor eagerly rejects any measurement containing a space by raising InvalidMeasurementError. Escaping is handled internally (via _escape_measurement) for characters like commas, but spaces in the measurement name are disallowed at construction time.","triggerScenarios":"Calling LineBuilder(\"my measurement\") — any measurement string containing a literal space character (' ') passed to __init__.","commonSituations":"Building measurement names from human-readable labels or user input ('cpu usage'), concatenating a name with a unit separated by a space, or copying a display name into code.","solutions":["Remove the space from the measurement name (use underscores or CamelCase).","Pass the escaped form explicitly if a space is truly required in line protocol ('my\\ measurement'), though a space-free name is strongly recommended.","Sanitize/normalize user- or config-supplied measurement names before constructing LineBuilder."],"exampleFix":"# before\nlb = LineBuilder(\"cpu usage\")\n# after\nlb = LineBuilder(\"cpu_usage\")","handlingStrategy":"validation","validationCode":"def safe_line_builder(measurement: str) -> \"LineBuilder\":\n    name = measurement.strip().replace(\" \", \"_\")\n    if not name:\n        raise ValueError(\"measurement name is empty\")\n    return LineBuilder(name)","typeGuard":"def is_valid_measurement(m) -> bool:\n    return isinstance(m, str) and len(m) > 0 and \" \" not in m","tryCatchPattern":"try:\n    lb = LineBuilder(measurement)\nexcept InvalidMeasurementError:\n    lb = LineBuilder(measurement.replace(\" \", \"_\"))","preventionTips":["Never use display labels directly as measurement names","Normalize user/config-supplied measurement names (strip, underscore)","Add unit tests asserting constructed line protocol for dynamic names","Prefer underscores or camelCase conventions for measurements"],"tags":["python","sdk","line-protocol","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}