-
Notifications
You must be signed in to change notification settings - Fork 54
LCORE-427: (docs) user data collection #518
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,224 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||
| # Lightspeed Stack user data collection | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Overview | ||||||||||||||||||||||||||||||||||||||||||||||||
| This document outlines the process of capturing user interactions and system responses in the Lightspeed Core Stack service. Understanding this process will help optimize the system for better responses and outcomes. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Components | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Lightspeed Core Stack | ||||||||||||||||||||||||||||||||||||||||||||||||
| - Every user interaction results in the storage of its transcript as a JSON file on the local disk. | ||||||||||||||||||||||||||||||||||||||||||||||||
| - When a user provides feedback (whether the LLM answer was satisfactory or not), the data is posted to the `/feedback` endpoint. This action also results in the creation of a JSON file. | ||||||||||||||||||||||||||||||||||||||||||||||||
| - Both transcripts and feedback are stored in configurable local directories with unique filenames. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Data Export Integration | ||||||||||||||||||||||||||||||||||||||||||||||||
| - The Lightspeed Core Stack integrates with the [lightspeed-to-dataverse-exporter](https://github.com/lightspeed-core/lightspeed-to-dataverse-exporter) service to automatically export various types of user interaction data to Red Hat's Dataverse for analysis. | ||||||||||||||||||||||||||||||||||||||||||||||||
| - The exporter service acts as a sidecar that periodically scans the configured data directories for new JSON files (transcripts and feedback). | ||||||||||||||||||||||||||||||||||||||||||||||||
| - It packages these data into archives and uploads them to the appropriate ingress endpoints. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Red Hat Dataverse Integration | ||||||||||||||||||||||||||||||||||||||||||||||||
| - The exporter service uploads data to Red Hat's Dataverse for analysis and system improvement. | ||||||||||||||||||||||||||||||||||||||||||||||||
| - Data flows through the same pipeline as other Red Hat services for consistent processing and analysis. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Configuration | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| User data collection is configured in the `user_data_collection` section of the configuration file: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ```yaml | ||||||||||||||||||||||||||||||||||||||||||||||||
| user_data_collection: | ||||||||||||||||||||||||||||||||||||||||||||||||
| feedback_enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| feedback_storage: "/tmp/data/feedback" | ||||||||||||||||||||||||||||||||||||||||||||||||
| transcripts_enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| transcripts_storage: "/tmp/data/transcripts" | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+28
to
+31
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid /tmp for persisted data. /tmp is ephemeral and often world-readable. Recommend a dedicated directory with restricted permissions. Apply (first snippet; mirror in others): - feedback_storage: "/tmp/data/feedback"
- transcripts_storage: "/tmp/data/transcripts"
+ feedback_storage: "/var/lib/lightspeed/data/feedback" # ensure dir exists with 700 perms
+ transcripts_storage: "/var/lib/lightspeed/data/transcripts" # ensure dir exists with 700 permsAnd add a note: +> mkdir -p /var/lib/lightspeed/data/{feedback,transcripts} && chmod -R 700 /var/lib/lightspeedAlso applies to: 124-128, 171-174 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||
| data_collector: | ||||||||||||||||||||||||||||||||||||||||||||||||
| enabled: false | ||||||||||||||||||||||||||||||||||||||||||||||||
| ingress_server_url: null | ||||||||||||||||||||||||||||||||||||||||||||||||
| ingress_server_auth_token: null | ||||||||||||||||||||||||||||||||||||||||||||||||
| ingress_content_service_name: null | ||||||||||||||||||||||||||||||||||||||||||||||||
| collection_interval: 7200 # 2 hours in seconds | ||||||||||||||||||||||||||||||||||||||||||||||||
| cleanup_after_send: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| connection_timeout_seconds: 30 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+38
to
+39
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Safer default for cleanup_after_send. Deleting local files immediately after upload can cause data loss on partial/failed uploads. Default to false and document verification semantics. Apply: - cleanup_after_send: true
+ cleanup_after_send: false # set to true only after verifying idempotent uploads and success checksAlso applies to: 180-181 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Configuration Options | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| #### Basic Data Collection | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `feedback_enabled`: Enable/disable collection of user feedback data | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `feedback_storage`: Directory path where feedback JSON files are stored | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `transcripts_enabled`: Enable/disable collection of conversation transcripts | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `transcripts_storage`: Directory path where transcript JSON files are stored | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| #### Data Collector Service (Advanced) | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `enabled`: Enable/disable the data collector service that uploads data to ingress | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `ingress_server_url`: URL of the ingress server for data upload | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `ingress_server_auth_token`: Authentication token for the ingress server | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `ingress_content_service_name`: Service name identifier for the ingress server | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+52
to
+54
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Don’t document storing raw tokens in config files. Recommend environment variables or secret stores instead of inline tokens. Apply: -- `ingress_server_auth_token`: Authentication token for the ingress server
+- `ingress_server_auth_token`: Authentication token for the ingress server. Do not store raw tokens in files; use environment variables or a secret manager (e.g., `${INGRESS_TOKEN}`) and mount/inject at runtime.📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||
| - `collection_interval`: Interval in seconds between data collection cycles (default: 7200 = 2 hours) | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `cleanup_after_send`: Whether to delete local files after successful upload (default: true) | ||||||||||||||||||||||||||||||||||||||||||||||||
| - `connection_timeout_seconds`: Timeout for connection to ingress server (default: 30) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Data Storage | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Feedback Data | ||||||||||||||||||||||||||||||||||||||||||||||||
| Feedback data is stored as JSON files in the configured `feedback_storage` directory. Each file contains: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ```json | ||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||
| "user_id": "user-uuid", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "timestamp": "2024-01-01T12:00:00Z", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "conversation_id": "conversation-uuid", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "user_question": "What is Kubernetes?", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "llm_response": "Kubernetes is an open-source container orchestration system...", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "sentiment": 1, | ||||||||||||||||||||||||||||||||||||||||||||||||
| "user_feedback": "This response was very helpful", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "categories": ["helpful"] | ||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+64
to
+75
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Clarify PII redaction vs. stored fields (feedback includes raw Q/A). Security section claims redaction, but feedback example stores Apply (feedback example): - "user_question": "What is Kubernetes?",
- "llm_response": "Kubernetes is an open-source container orchestration system...",
+ "redacted_user_question": "What is <technology>?",
+ "redacted_llm_response": "…",And expand Security: - **Data Redaction**: Query data is stored as "redacted_query" to ensure sensitive information is not captured
+ **Data Redaction**: All persisted user-visible fields (queries, responses, feedback) must be redacted before storage (`redacted_*` fields). Do not persist raw values unless you have explicit consent and a lawful basis.Also applies to: 190-193 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Transcript Data | ||||||||||||||||||||||||||||||||||||||||||||||||
| Transcript data is stored as JSON files in the configured `transcripts_storage` directory, organized by user and conversation: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
| /transcripts_storage/ | ||||||||||||||||||||||||||||||||||||||||||||||||
| /{user_id}/ | ||||||||||||||||||||||||||||||||||||||||||||||||
| /{conversation_id}/ | ||||||||||||||||||||||||||||||||||||||||||||||||
| /{unique_id}.json | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| Each transcript file contains: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ```json | ||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||
| "metadata": { | ||||||||||||||||||||||||||||||||||||||||||||||||
| "provider": "openai", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "model": "gpt-4", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "query_provider": "openai", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "query_model": "gpt-4", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "user_id": "user-uuid", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "conversation_id": "conversation-uuid", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "timestamp": "2024-01-01T12:00:00Z" | ||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||
| "redacted_query": "What is Kubernetes?", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "query_is_valid": true, | ||||||||||||||||||||||||||||||||||||||||||||||||
| "llm_response": "Kubernetes is an open-source container orchestration system...", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "rag_chunks": [], | ||||||||||||||||||||||||||||||||||||||||||||||||
| "truncated": false, | ||||||||||||||||||||||||||||||||||||||||||||||||
| "attachments": [] | ||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Data Flow | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 1. **User Interaction**: User submits a query to the `/query` or `/streaming_query` endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||
| 2. **Transcript Storage**: If transcripts are enabled, the interaction is stored as a JSON file | ||||||||||||||||||||||||||||||||||||||||||||||||
| 3. **Feedback Collection**: User can submit feedback via the `/feedback` endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||
| 4. **Feedback Storage**: If feedback is enabled, the feedback is stored as a JSON file | ||||||||||||||||||||||||||||||||||||||||||||||||
| 5. **Data Export**: The exporter service (if enabled) periodically scans for new files and uploads them to the ingress server | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## How to Test Locally | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Basic Data Collection Testing | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 1. **Enable data collection** in your `lightspeed-stack.yaml`: | ||||||||||||||||||||||||||||||||||||||||||||||||
| ```yaml | ||||||||||||||||||||||||||||||||||||||||||||||||
| user_data_collection: | ||||||||||||||||||||||||||||||||||||||||||||||||
| feedback_enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| feedback_storage: "/tmp/data/feedback" | ||||||||||||||||||||||||||||||||||||||||||||||||
| transcripts_enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| transcripts_storage: "/tmp/data/transcripts" | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 2. **Start the Lightspeed Core Stack**: | ||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||
| python -m src.app.main | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 3. **Submit a query** to generate transcript data: | ||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||
| curl -X POST "http://localhost:8080/query" \ | ||||||||||||||||||||||||||||||||||||||||||||||||
| -H "Content-Type: application/json" \ | ||||||||||||||||||||||||||||||||||||||||||||||||
| -d '{ | ||||||||||||||||||||||||||||||||||||||||||||||||
| "query": "What is Kubernetes?", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "provider": "openai", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "model": "gpt-4" | ||||||||||||||||||||||||||||||||||||||||||||||||
| }' | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 4. **Submit feedback** to generate feedback data: | ||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||
| curl -X POST "http://localhost:8080/feedback" \ | ||||||||||||||||||||||||||||||||||||||||||||||||
| -H "Content-Type: application/json" \ | ||||||||||||||||||||||||||||||||||||||||||||||||
| -d '{ | ||||||||||||||||||||||||||||||||||||||||||||||||
| "conversation_id": "your-conversation-id", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "user_question": "What is Kubernetes?", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "llm_response": "Kubernetes is...", | ||||||||||||||||||||||||||||||||||||||||||||||||
| "sentiment": 1, | ||||||||||||||||||||||||||||||||||||||||||||||||
| "user_feedback": "Very helpful response" | ||||||||||||||||||||||||||||||||||||||||||||||||
| }' | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+146
to
+157
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add instruction to obtain conversation_id before posting feedback. The feedback example requires Insert before the feedback curl: +4a. Extract the conversation_id from the latest transcript:
+```bash
+CONVERSATION_ID=$(jq -r '.metadata.conversation_id' "$(find /var/lib/lightspeed/data/transcripts -type f -name '*.json' -print0 | xargs -0 ls -t | head -n1)")
+echo "$CONVERSATION_ID"
+```And update the payload: - "conversation_id": "your-conversation-id",
+ "conversation_id": "'"$CONVERSATION_ID"'",🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 5. **Check stored data**: | ||||||||||||||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||||||||||||||
| ls -la /tmp/data/feedback/ | ||||||||||||||||||||||||||||||||||||||||||||||||
| ls -la /tmp/data/transcripts/ | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Advanced Data Collector Testing | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 1. **Enable data collector** in your configuration: | ||||||||||||||||||||||||||||||||||||||||||||||||
| ```yaml | ||||||||||||||||||||||||||||||||||||||||||||||||
| user_data_collection: | ||||||||||||||||||||||||||||||||||||||||||||||||
| feedback_enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| feedback_storage: "/tmp/data/feedback" | ||||||||||||||||||||||||||||||||||||||||||||||||
| transcripts_enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| transcripts_storage: "/tmp/data/transcripts" | ||||||||||||||||||||||||||||||||||||||||||||||||
| data_collector: | ||||||||||||||||||||||||||||||||||||||||||||||||
| enabled: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| ingress_server_url: "https://your-ingress-server.com/upload" | ||||||||||||||||||||||||||||||||||||||||||||||||
| ingress_server_auth_token: "your-auth-token" | ||||||||||||||||||||||||||||||||||||||||||||||||
| ingress_content_service_name: "lightspeed-stack" | ||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+169
to
+178
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Use env var for auth token in examples. Inline secrets are risky and get copy-pasted. Apply: data_collector:
enabled: true
ingress_server_url: "https://your-ingress-server.com/upload"
- ingress_server_auth_token: "your-auth-token"
+ ingress_server_auth_token: ${INGRESS_TOKEN} # injected via environment/secret
ingress_content_service_name: "lightspeed-stack"Add a brief note below with a safe export example: +> Note: In local testing, export the token for the current shell only:
+> `export INGRESS_TOKEN='<redacted>'`📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||
| collection_interval: 60 # 1 minute for testing | ||||||||||||||||||||||||||||||||||||||||||||||||
| cleanup_after_send: true | ||||||||||||||||||||||||||||||||||||||||||||||||
| connection_timeout_seconds: 30 | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 2. **Deploy the exporter service** pointing to the same data directories | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 3. **Monitor the data collection** by checking the logs and verifying that files are being uploaded and cleaned up | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Security Considerations | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| - **Data Privacy**: All user data is stored locally and can be configured to be cleaned up after upload | ||||||||||||||||||||||||||||||||||||||||||||||||
| - **Authentication**: The data collector service uses authentication tokens for secure uploads | ||||||||||||||||||||||||||||||||||||||||||||||||
| - **Data Redaction**: Query data is stored as "redacted_query" to ensure sensitive information is not captured | ||||||||||||||||||||||||||||||||||||||||||||||||
| - **Access Control**: Data directories should be properly secured with appropriate file permissions | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Troubleshooting | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Common Issues | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 1. **Data not being stored**: Check that the storage directories exist and are writable | ||||||||||||||||||||||||||||||||||||||||||||||||
| 2. **Data collector not uploading**: Verify the ingress server URL and authentication token | ||||||||||||||||||||||||||||||||||||||||||||||||
| 3. **Permission errors**: Ensure the service has write permissions to the configured directories | ||||||||||||||||||||||||||||||||||||||||||||||||
| 4. **Connection timeouts**: Adjust the `connection_timeout_seconds` setting if needed | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ### Logging | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| Enable debug logging to troubleshoot data collection issues: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ```yaml | ||||||||||||||||||||||||||||||||||||||||||||||||
| service: | ||||||||||||||||||||||||||||||||||||||||||||||||
| log_level: debug | ||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| This will provide detailed information about data collection, storage, and upload processes. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ## Integration with Red Hat Dataverse | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| For production deployments, the Lightspeed Core Stack integrates with Red Hat's Dataverse through the exporter service. This provides: | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| - Centralized data collection and analysis | ||||||||||||||||||||||||||||||||||||||||||||||||
| - Consistent data processing pipeline | ||||||||||||||||||||||||||||||||||||||||||||||||
| - Integration with other Red Hat services | ||||||||||||||||||||||||||||||||||||||||||||||||
| - Automated data export and cleanup | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| For complete integration setup, deployment options, and configuration details, see the [exporter repository](https://github.com/lightspeed-core/lightspeed-to-dataverse-exporter). | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Validate “Red Hat Dataverse” naming/branding.
Confirm the correct upstream/product name and link to avoid brand inaccuracies.
Also applies to: 215-224
🌐 Web query:
💡 Result:
Short answer: No — it's not called "Red Hat Dataverse." The destination is Microsoft Dataverse (formerly Common Data Service) when referring to business/app data exports; "Dataverse" (Harvard/IQSS) is a separate open‑source research data platform and Red Hat is not the product owner. [1][2][3]
Sources:
Update “Red Hat Dataverse” to “Microsoft Dataverse” and add official link
In docs/user_data_collection.md (18–21, 215–224), rename and relink as follows:
Also update any remaining “Red Hat Dataverse” mentions in lines 215–224.
📝 Committable suggestion
🤖 Prompt for AI Agents