2012-07-13 25 views
10

Có cách nào để xác định tên dyno heroku (ví dụ: web.1, web.2) từ bên trong ứng dụng không? Tôi muốn có thể tạo một id yêu cầu duy nhất (ví dụ: để theo dõi các yêu cầu giữa web và dynos của công nhân cho việc ghi nhật ký tổng hợp của toàn bộ yêu cầu) và dường như với tôi rằng mã định danh dyno sẽ tạo một điểm khởi đầu tốt.Làm thế nào để xác định số dyno heroku từ bên trong ứng dụng?

Nếu không thể thực hiện việc này, có ai có đề xuất dự phòng không?

Trả lời

6

Tôi đã hỏi câu hỏi này về sự hỗ trợ của Heroku, và vì có những người khác ở đây, những người đã hỏi những câu hỏi tương tự như tôi nên tôi đã chia sẻ nó. Nhân viên của Heroku JD đã trả lời như sau:

Không, không thể xem thông tin này từ bên trong dyno. Chúng tôi đã xem xét yêu cầu tính năng này trước đây và đã chọn không triển khai, vì điều này sẽ giới thiệu biến số cụ thể Heroku mà chúng tôi muốn tránh trong ngăn xếp của chúng tôi. Do đó, chúng tôi không có kế hoạch triển khai tính năng này.

Bạn có thể tạo/thêm vào môi trường của bạn một định danh duy nhất (ví dụ như một UUID ) khi khởi động Dyno để thực hiện một kết quả tương tự, và bạn có thể tương quan này để dynos của ứng dụng của bạn bằng cách in nó vào các bản ghi của bạn tại đó thời gian . Nếu bạn cần tìm lại sau này, bạn có thể kiểm tra nhật ký của mình cho dòng đó (tất nhiên, bạn sẽ cần thoát nhật ký của mình bằng cách sử dụng Papertrail, Loggly, v.v. hoặc tới máy chủ của riêng bạn).

Thật không may cho trường hợp của tôi, UUID quá dài (nếu tôi muốn một lượng dữ liệu lớn như vậy, tôi sẽ chỉ sử dụng UUID để theo dõi mọi thứ ngay từ đầu). Nhưng nó vẫn còn tốt để có một câu trả lời chính thức.

+4

Pfft, điều này là không thể chấp nhận được vì tôi nắm bắt các chỉ số và trang tổng quan của tôi không thể được định cấu hình lại mỗi khi nguồn (UUID) thay đổi. Tôi sẽ đưa ra yêu cầu một lần nữa :-) – opyate

+0

Cuối cùng chúng tôi đã phát hiện ra [bông tuyết] (https://github.com/twitter/snowflake) và sau đó tạo thế hệ id [noeqd] (https://github.com/noeq) của riêng Heroku máy chủ. Thật đáng tiếc là heroku không tiết lộ dịch vụ noeq cho khách hàng của họ, nhưng nó rất dễ dàng để thiết lập và chạy, và mỗi máy chủ có thể dễ dàng tạo ra hơn một triệu giá trị ID duy nhất mỗi giây. đủ để theo dõi ID yêu cầu. –

+0

Điều này là vô lý. –

15

Gần đây, vấn đề đã được nhóm Heroku giải quyết.

Trình quản lý Dyno thêm DYNO biến môi trường chứa số nhận dạng của dyno của bạn, ví dụ: web.1, web.2, foo.1 vv Tuy nhiên, biến vẫn đang thử nghiệm và có thể thay đổi hoặc xóa.

Tôi cần giá trị đó (thực tế chỉ mục ví dụ như 1, 2 v.v.) để khởi tạo trình tạo id flake khi khởi động thể hiện và biến này hoạt động hoàn toàn tốt cho tôi.

Bạn có thể đọc thêm về các biến số trên Local environment variables.

+0

Người quản đốc nhận thông tin ở đâu? Khi tôi chạy một ứng dụng đường ray cục bộ với một Procfile và foreman, các bản ghi có "web.1", "worker.1" vv trong đó. –

+0

Ah, quản đốc chạy tại địa phương đặt $ PS, mà $ DYNO thay thế trên heroku. –

2

Heroku có $DYNO environment variable, tuy nhiên có một số hãy cẩn thận lớn gắn liền với nó:

  1. "Biến $ Dyno là thử nghiệm và có thể thay đổi hoặc loại bỏ." Vì vậy, họ có thể mang nó đi bất cứ lúc nào.
  2. "$ DYNO không được đảm bảo là duy nhất trong ứng dụng". Đây là vấn đề khó giải quyết hơn, đặc biệt nếu bạn đang tìm cách triển khai một cái gì đó giống như ID Snowflake.

Đối với sự cố bạn đang cố giải quyết, router request ID có thể phù hợp hơn. Heroku chuyển một ID duy nhất cho mọi yêu cầu web thông qua tiêu đề X-Request-ID. Bạn có thể chuyển nó cho nhân viên và có cả cá thể web và nhân viên đăng nhập ID yêu cầu bất cứ khi nào họ ghi lại thông tin cho một yêu cầu/bit công việc cụ thể.Điều đó sẽ cho phép bạn tương quan sự cố trong nhật ký.

0

Điều này có thể không trả lời chính xác câu hỏi, nhưng bạn có thể có một dòng khác trong Procfile của bạn cho mỗi quy trình công nhân (sử dụng thang ps: 1 cho mỗi người). Sau đó bạn có thể chuyển số nhân viên dưới dạng biến môi trường từ Procfile.

Hai dòng từ một ví dụ procfile có thể trông giống như:

worker_1: env WORKER_NUMBER=1 node worker 
worker_2: env WORKER_NUMBER=2 node worker 
0

Các foreman đá quý vẫn sử dụng $PS, vì vậy để truy cập tên Dyno và có nó hoạt động cả trên Heroku và phát triển (khi sử dụng foreman) bạn có thể kiểm tra $PS trước và sau đó $DYNO. Để xử lý trường hợp của bảng điều khiển cục bộ, hãy kiểm tra Rails.console

dyno_name = ENV['PS'] || ENV['DYNO'] || (defined?(Rails::Console) ? "console" : "") 
0

Thật nguy hiểm khi sử dụng biến môi trường DYNO vì giá trị của nó không được đảm bảo là duy nhất. Điều đó có nghĩa là bạn có thể có hai dynos chạy cùng lúc với cùng giá trị biến DYNO. Cách an toàn để làm điều này là kích hoạt siêu dữ liệu dyno và sau đó sử dụng biến môi trường HEROKU_DYNO_ID. Điều đó sẽ tốt hơn cho phép bạn tạo các id yêu cầu duy nhất. Xem: https://devcenter.heroku.com/articles/dyno-metadata

Các vấn đề liên quan